将Where子句添加到Doctrine本机查询构建器

时间:2017-03-23 14:56:18

标签: php mysql symfony doctrine-orm doctrine

如何在Symfony Doctrine中添加where子句到Native Query。例如,我的初始查询如:

      $query = $em->createQuery("select distinct s.id
    from service s join tags_services t on t.service_id=s.id join tag on t.tag_id = tag.id
    where
        (s.title like '%play%'
        or tag.name like '%play%'
        or s.description  like '%play%')
    order by 
         s.title like '%play%' desc,
         tag.name like '%play%' desc,
         s.description  like '%play%' desc");
     $services = $query->getResult();

但如果我想用更多参数过滤此结果,例如添加

 'AND s.category = :category'

如果给出了类别。或添加排序参数。基本上我试图了解如何动态更改此查询字符串。

1 个答案:

答案 0 :(得分:1)

这样的东西?

$filter = '';

if (category instanceOf Category) {
   filter = ' AND s.category = :category'
}

$sql = '
    select distinct s.id
     from service s 
     join tags_services t on t.service_id=s.id join tag on t.tag_id = tag.id
     where
         (s.title like :play
         or tag.name like :play
         or s.description  like :play)
         '. $filter .'
     order by 
         s.title desc,
         tag.name desc,
         s.description desc'

你也可以使用querybuilder:

$qb = $this->createQueryBuilder('s')
    ->addSelect('distinct s.id')
    ->join('s.tags_services', 'ts')
    ->join('ts.tag', 't');

$qb->where($qb->expr()->orX(
    $qb->expr()->like('s.title', ':play'),
    $qb->expr()->like('t.name', ':play'),
    $qb->expr()->like('s.description', ':play'),
));

if (category instanceOf Category) {
    $qb->addWhere(...)
}
相关问题