oro-flex/doctrine-utils

`Oro Doctrine Utils 组件` 提供了一些有用的类,旨在使使用 Doctrine 组件更加容易。

4.2.0 2022-01-08 09:15 UTC

This package is auto-updated.

Last update: 2024-09-08 15:23:51 UTC


README

Oro Doctrine Utils 组件 提供了一些有用的类,旨在使使用 Doctrine 组件更加容易。

QueryHintResolver 类

可以使用 QueryHintResolver 来使 Doctrine 查询提示 更加灵活。

以下是类方法的描述

  • addTreeWalker - 将查询提示映射到树遍历器。
  • addOutputWalker - 将查询提示映射到输出遍历器。
  • resolveHints - 解析查询提示。
  • addHint - 向查询对象添加提示。
  • addHints - 向查询对象添加提示。

SqlWalker 和 TranslatableSqlWalker 输出 SQL 遍历器

SqlWalkerTranslatableSqlWalkerDoctrine 输出遍历器,用于修改查询以提高供应商优化。应使用 TranslatableSqlWalker 而不是 Gedmo TranslationWalker。

两个遍历器都使用 DecoratedSqlWalkerTrait,该 trait 负责在结果构建之前对所有 SQL 输出遍历器调用进行装饰,并使用 OutputAstWalkerInterface 进行调用,在结果准备就绪之后,使用 OutputResultModifierInterface 进行调用。OutputAstWalkerInterface 和 OutputResultModifierInterface 通过两个提示 HINT_AST_WALKERSHINT_RESULT_MODIFIERS 添加到查询中。这些提示在容器构建期间自动填充为数组。要添加自己的 AST 遍历器或输出结果修改器,请使用 oro_entity.sql_walker DI 标签。

应使用 OutputAstWalkerInterface 来修改 AST 树,但不能生成 SQL。要更改生成的 SQL,请使用 OutputResultModifierInterface(它可以访问 AST 但不应修改它)。

oro_entity.sql_walker.union:
    class: Oro\Component\DoctrineUtils\ORM\Walker\UnionOutputResultModifier
    public: false
    abstract: true
    tags:
        - { name: oro_entity.sql_walker }

默认情况下,已注册了几个输出结果修改器

PostgreSqlOrderByNullsOutputResultModifier - NULL 排序

类的一个目标是对齐 MySQL 和 PostgreSQL 的 NULL 排序逻辑。默认情况下,当进行 ASC 排序时,MySQL 中 NULL 排序在前,PostgreSQL 中在后。当 NULL 出现在 ORDER BY 子句中时,SqlWalker 对可空列应用 NULLS FIRST 指令。对于 DESC 排序,也应用 NULLS LAST 指令。

可以通过设置特殊查询提示 HINT_DISABLE_ORDER_BY_MODIFICATION_NULLS 来关闭此行为

$query->setHint('HINT_DISABLE_ORDER_BY_MODIFICATION_NULLS', true);

MySqlUseIndexOutputResultModifier - 强制 MySQL 使用 索引

MySqlUseIndexOutputResultModifier 提供了指定 MySQL 应使用的具体索引的功能。索引从查询提示 HINT_USE_INDEX 中获取

$query->setHint('HINT_USE_INDEX', 'my_custom_idx');

UnionOutputResultModifier - 将 Union SELECT 添加到给定的查询中

UnionOutputResultModifier 提供联合功能。联合被添加到一个占位符中,并保存为 HINT_UNION_KEY。UNION 查询的值从 HINT_UNION_VALUE 中获取。

PreciseOrderByWalker 类

PreciseOrderByWalker 是一个 Doctrine 树遍历器,用于修改查询的 ORDER BY 子句,以确保记录的返回顺序与 SQL 服务器状态无关,也与 OFFSET 和 LIMIT 子句的值无关。这是通过将第一个根实体的主键列添加到 ORDER BY 子句的末尾来实现的。

使用示例

$query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [PreciseOrderByWalker::class]);

TransactionWatcherInterface 接口

有时需要在数据提交到数据库后执行某些工作。例如,向用户或外部系统发送通知。在这种情况下,TransactionWatcherInterface 可以很有帮助。

为了能够注册 DBAL 事务观察者,您需要在您的应用程序中注册 AddTransactionWatcherCompilerPass 编译器遍历和事务观察者感知连接代理的类加载器,例如

class AppBundle extends Bundle
{
    public function __construct(KernelInterface $kernel)
    {
        TransactionWatcherConfigurator::registerConnectionProxies($kernel->getCacheDir());
    }

    public function build(ContainerBuilder $container)
    {
        $container->addCompilerPass(
            new AddTransactionWatcherCompilerPass('oro.doctrine.connection.transaction_watcher')
        );
    }
}

QueryBuilderUtil 类

动态构造 DQL 查询可能会使其容易受到注入攻击。为了确保传递的数据、字段名或表别名是安全的,QueryBuilderUtil 包含一系列方法:sprintf - 应作为查询安全的替代方案使用而不是 sprintf,checkIdentifier - 当需要将变量安全地作为标识符的一部分传递到查询中时,getField - 是 QueryBuilderUtil::sprintf('%s.%s', $alias, $field) 的快捷方式。