Search code examples
phppostgresqlsymfonydoctrine-ormdoctrine

Use PostgreSQL NOT SIMILAR TO in Symfony Doctrine query builder


I am attempting to use PostgreSQL's NOT SIMILAR TO exclude a blacklist from the results of a query,

When I run the query in my repository method below:

$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();

I get the following error:

[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'  

However, when I run this query against my local DB with PgAdmin it works.

How can I achieve this with Doctrine using the Symfony Doctrine Query builder (or similar)? I am using PostgreSQL 9.5.5


Solution

  • $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();