在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'))
型
muk1a3rh1#
解决方案是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)然后in可以在查询生成器或表达式生成器中使用,如下所示:
$expr->orX()->add('REGEX(e.field, :pattern) = true');
9w11ddsr2#
martin-georgiev/postgresql-for-doctrine @ GitHub增加了对REGEXP、SIMILAR_TO、JSON_GET_FIELD和CONTAINS运算符等的支持。SIMILAR_TO是PostreSQL操作符,用于正则表达式的模式匹配(参见9.7.2. SIMILAR TO Regular Expressions @ PostgreSQL文档)。对于MariaDB数据库使用正则表达式,beberlei/DoctrineExtensions @ GitHub似乎是响应。
martin-georgiev/postgresql-for-doctrine
REGEXP
SIMILAR_TO
JSON_GET_FIELD
CONTAINS
beberlei/DoctrineExtensions
2条答案
按热度按时间muk1a3rh1#
解决方案是
1)创建自定义DQL函数
字符串
2)在config中注册
3)然后in可以在查询生成器或表达式生成器中使用,如下所示:
型
9w11ddsr2#
martin-georgiev/postgresql-for-doctrine
@ GitHub增加了对REGEXP
、SIMILAR_TO
、JSON_GET_FIELD
和CONTAINS
运算符等的支持。SIMILAR_TO
是PostreSQL操作符,用于正则表达式的模式匹配(参见9.7.2. SIMILAR TO Regular Expressions @ PostgreSQL文档)。对于MariaDB数据库使用正则表达式,
beberlei/DoctrineExtensions
@ GitHub似乎是响应。