【问题标题】:Use PostgreSQL NOT SIMILAR TO in Symfony Doctrine query builder在 Symfony Doctrine 查询构建器中使用 PostgreSQL NOT SIMILAR TO
【发布时间】: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

【问题讨论】:

    标签: php postgresql symfony doctrine-orm doctrine


    【解决方案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 LIKEs。当我看到你的回答时,这很有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多