oro-flex / doctrine-utils
`Oro Doctrine Utils 组件` 提供了一些有用的类,旨在使使用 Doctrine 组件更加容易。
Requires
- php: ~7.4.14 || ~8.0.0
Conflicts
- oro/platform: *
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 遍历器
SqlWalker 和 TranslatableSqlWalker 是 Doctrine 输出遍历器,用于修改查询以提高供应商优化。应使用 TranslatableSqlWalker 而不是 Gedmo TranslationWalker。
两个遍历器都使用 DecoratedSqlWalkerTrait,该 trait 负责在结果构建之前对所有 SQL 输出遍历器调用进行装饰,并使用 OutputAstWalkerInterface 进行调用,在结果准备就绪之后,使用 OutputResultModifierInterface 进行调用。OutputAstWalkerInterface 和 OutputResultModifierInterface 通过两个提示 HINT_AST_WALKERS
和 HINT_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) 的快捷方式。