在 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'))
解决办法是
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');
martin-georgiev/postgresql-for-doctrine
@ GitHub 添加了对 REGEXP
、SIMILAR_TO
、JSON_GET_FIELD
和 CONTAINS
运算符等的支持。
SIMILAR_TO
是 PostreSQL 运算符,用于与正则表达式进行模式匹配(请参阅 9.7.2. 与 PostgreSQL 文档中的正则表达式类似)。
beberlei/DoctrineExtensions
@GitHub 似乎是答案。