Как создать несколько условий регулярных выражений с Doctrine QueryBuilder - PullRequest
0 голосов
/ 03 июня 2018

При использовании Doctrine ORM с Postgres, как создать то же самое, что этот SQL делает с QueryBuilder:

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

Я также хотел бы избежать наличия всех условий в одной строке, например:

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

1 Ответ

0 голосов
/ 04 июня 2018

Решение состоит в том, чтобы

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), затем вможет использоваться в построителе запросов или построителе выражений следующим образом:

$expr->orX()->add('REGEX(e.field, :pattern) = true');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...