在 Symfony Doctrine 查询构建器中使用 PostgreSQL NOT SIMILAR TO
Posted
技术标签:
【中文标题】在 Symfony Doctrine 查询构建器中使用 PostgreSQL NOT SIMILAR TO【英文标题】:Use PostgreSQL NOT SIMILAR TO in Symfony Doctrine query builder 【发布时间】:2017-02-16 03:31:32 【问题描述】:我正在尝试使用 PostgreSQL 的 NOT SIMILAR TO 从查询结果中排除黑名单,
当我在下面的存储库方法中运行查询时:
$qb = $this->getEntityManager()->createQueryBuilder('p');
$query = $qb
->select('p')
->from('CRMPiccoBundle:Person', 'p')
->where("lower(p.email) not similar to '(" . implode('|', $blacklist) . ")%'")
->getQuery();
return $query->getResult();
我收到以下错误:
[Doctrine\ORM\Query\QueryException]
SELECT p FROM CRMPiccoBundle:Person p WHERE lower(p.email) not similar to '(abuse@|admin@|billing@|compliance@|devnull@)%'
[Doctrine\ORM\Query\QueryException]
[Syntax Error] line 0, col 94: Error: Expected end of string, got 'to'
但是,当我使用 PgAdmin 对本地数据库运行此查询时,它可以正常工作。
如何使用 Symfony Doctrine Query builder(或类似工具)通过 Doctrine 实现这一点?我正在使用 PostgreSQL 9.5.5
【问题讨论】:
【参考方案1】:$qb = $this->getEntityManager()->createQueryBuilder('p');
$select = $qb
->select('p')
->from('CRMPiccoBundle:Person', 'p')
;
foreach ($blacklist as $key => $item)
$select
->where('lower(p.email) NOT LIKE :key'.$key)
->setParameter('key'.$key, "$item%")
;
$query = $select->getQuery();
return $query->getResult();
【讨论】:
@crmpicco 感谢您的编辑,我不关注这一点,因为我只编写代码而不进行测试:D 感谢您的回答,我没想过要像这样排列NOT LIKE
s。当我看到你的回答时,这很有意义。以上是关于在 Symfony Doctrine 查询构建器中使用 PostgreSQL NOT SIMILAR TO的主要内容,如果未能解决你的问题,请参考以下文章
Symfony - 在学说查询构建器中使用 orWhere()
如何使用 Doctrine 在 Symfony2 中实现子查询?