REGEX()
DQL 函数。
现在,我想在表达式生成器中使用该函数
$expr = $queryBuilder->expr();
$or = $expr->orX();
$or->add($expr->eq("REGEX(s.field, '[a-z]+')", true));
这对我不起作用,因为它被转换为
s0_.field :: TEXT ~ '[a-z]' = 1
,它会在 Postgres 中将布尔值与 int 进行比较时抛出:
SQLSTATE[42883]:未定义函数:7 错误:运算符不存在:布尔值 = 整数。
我还尝试使用
$or->add("s.field ~ '[a-z]+')")
避免使用 dql 函数,但 ORM 不支持 ~
运算符。
我的 DQL 函数构建为
public function getSql(SqlWalker $sqlWalker): string
{
return sprintf(
'%s :: TEXT %s %s',
$this->fieldExpression->dispatch($sqlWalker),
'~',
$this->patternExpression->dispatch($sqlWalker),
);
}
将运算符替换为函数
-- nameregexeq
SELECT oprname, oprcode
FROM pg_operator
WHERE oprname = '~';
-- example
SELECT TEXTREGEXEQ('a', '[a-z]'), TEXTREGEXEQ('1', '[a-z]')