shipmonk / doctrine-hint-driven-sql-walker
Doctrine的SqlWalker允许通过->setHint()钩接多个处理器,每个处理器都可以编辑生成的SQL或其部分。
2.0.0
2024-08-08 12:52 UTC
Requires
- php: ^8.1
- doctrine/orm: ^3.0.0
Requires (Dev)
- doctrine/dbal: ^4.0
- doctrine/event-manager: ^2.0
- editorconfig-checker/editorconfig-checker: ^10.6.0
- ergebnis/composer-normalize: ^2.43.0
- phpstan/phpstan: ^1.11.5
- phpstan/phpstan-phpunit: ^1.4.0
- phpstan/phpstan-strict-rules: ^1.6.0
- phpunit/phpunit: ^10.5.24
- shipmonk/composer-dependency-analyser: ^1.5.3
- shipmonk/phpstan-rules: ^3.0
- slevomat/coding-standard: ^8.15.0
- dev-master
- 2.0.0
- 1.0.0
- dev-dependabot/composer/phpstan/phpstan-tw-1.12.0
- dev-dependabot/composer/shipmonk/phpstan-rules-tw-3.2
- dev-dependabot/composer/doctrine/dbal-tw-4.1
- dev-dependabot/composer/phpunit/phpunit-tw-11.3.1
- dev-dependabot/composer/shipmonk/composer-dependency-analyser-tw-1.7.0
- dev-janedbal-patch-1
- dev-dependabot-validate
This package is auto-updated.
Last update: 2024-09-01 12:15:06 UTC
README
自从Doctrine的SqlWalker作为DQL AST到SQL的翻译器以来,当您想通过这种方法在多个库中更改生成的SQL时,就会变得有问题。只有一个SqlWalker。
这个库通过提供HintHandler
基类来解决此问题,该类旨在修改SQL,并且可以在$queryBuilder->setHint()
中多次使用。
安装
composer require shipmonk/doctrine-hint-driven-sql-walker
用法
$queryBuilder ->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, HintDrivenSqlWalker::class) ->setHint(MaxExecutionTimeHintHandler::class, 1000)
其中MaxExecutionTimeHintHandler
仅扩展我们的HintHandler
并选择一些SqlNode
来钩接并更改适当的SQL部分
class MaxExecutionTimeSqlWalker extends HintHandler { public function getNodes(): array { return [SqlNode::SelectClause]; } public function processNode( SqlNode $sqlNode, string $sql, ): string { // grab the 1000 passed to ->setHint() $milliseconds = $this->getHintValue(); // edit SQL as needed return preg_replace( '~^SELECT (.*?)~', "SELECT /*+ MAX_EXECUTION_TIME($milliseconds) */ \\1 ", $sql ); }
SqlNode
是Doctrine的SqlWalker中所有walkXxx
方法的枚举,因此您可以拦截SqlWalker执行的AST处理中的任何部分。