如何使用 Doctrine QueryBuilder 创建多个正则表达式条件

问题描述 投票:0回答:2

在 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
2个回答
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');

0
投票

martin-georgiev/postgresql-for-doctrine
@ GitHub 添加了对
REGEXP
SIMILAR_TO
JSON_GET_FIELD
CONTAINS
运算符等的支持。

SIMILAR_TO
是 PostreSQL 运算符,用于与正则表达式进行模式匹配(请参阅 9.7.2. 与 PostgreSQL 文档中的正则表达式类似)。

对于在 MariaDB 数据库中使用正则表达式,

beberlei/DoctrineExtensions
@GitHub 似乎是答案。

© www.soinside.com 2019 - 2024. All rights reserved.