shipmonk/doctrine-hint-driven-sql-walker

Doctrine的SqlWalker允许通过->setHint()钩接多个处理器,每个处理器都可以编辑生成的SQL或其部分。


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处理中的任何部分。

实现者

兼容性