【问题标题】:How to create multiple regex conditions with Doctrine QueryBuilder如何使用 Doctrine QueryBuilder 创建多个正则表达式条件
【发布时间】:2018-06-03 16:37:14
【问题描述】:

在 Postgres 中使用 Doctrine ORM 时,如何创建与使用 QueryBuilder 相同的 SQL:

WHERE column2 IS NOT NULL AND (column1 ~= :pattern OR column1 ~= :pattern2)

我还想避免将所有条件放在一行中,如下所示:

->andWhere('column2 IS NOT NULL AND (column1 ~= :pattern OR column1 ~= :pattern2'))

【问题讨论】:

    标签: php sql postgresql doctrine-orm


    【解决方案1】:

    解决办法是

    1) 创建自定义 DQL 函数

    <?php
    
    declare(strict_types=1);
    
    use Doctrine\ORM\Query\AST\Functions\FunctionNode;
    use Doctrine\ORM\Query\AST\Node;
    use Doctrine\ORM\Query\Lexer;
    use Doctrine\ORM\Query\Parser;
    use Doctrine\ORM\Query\SqlWalker;
    use function sprintf;
    
    /**
     * "REGEX" "(" StringPrimary "," StringPrimary ")"
     */
    final class RegexFunction extends FunctionNode
    {
        /** @var Node */
        public $fieldExpression;
    
        /** @var Node */
        public $patternExpression;
    
        /**
         * @inheritdoc
         */
        public function getSql(SqlWalker $sqlWalker) : string
        {
            return sprintf(
                '%s :: TEXT ~* %s',
                $this->fieldExpression->dispatch($sqlWalker),
                $this->patternExpression->dispatch($sqlWalker)
            );
        }
    
        /**
         * @inheritdoc
         */
        public function parse(Parser $parser) : void
        {
            $parser->match(Lexer::T_IDENTIFIER);
            $parser->match(Lexer::T_OPEN_PARENTHESIS);
    
            $this->fieldExpression = $parser->StringPrimary();
            $parser->match(Lexer::T_COMMA);
            $this->patternExpression = $parser->StringPrimary();
    
            $parser->match(Lexer::T_CLOSE_PARENTHESIS);
        }
    }
    

    2) 注册到config

    3) then in 可以像这样在查询构建器或表达式构建器中使用:

    $expr->orX()->add('REGEX(e.field, :pattern) = true');
    

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多