使用andwhere()的Symfony2 / Doctrine QueryBuilder

时间:2012-01-16 01:42:14

标签: doctrine symfony

我在存储库类中使用以下方法来查找数据库中的某些标记:

public function getItemsByTag($tag, $limit = null)
{
    $tag = '%'.$tag.'%';

    $qb = $this->createQueryBuilder('c');

    $qb->select('c')
       ->where($qb->expr()->like('c.tags', '?1'))
       ->setParameter(1, $tag)
       ->addOrderBy('c.clicks', 'DESC');

    if (false === is_null($limit))
        $qb->setMaxResults($limit);

    return $qb->getQuery()->getResult();
}

这很好用..但是:如何添加2个额外的变量(其中:reviews = 1,enabled = 1)?我试过andwhere()但是我无法理解它。

我也发现了这样的事情:

public function getItems($limit = null)
{
        $qb = $this->createQueryBuilder('b')
               ->select('b')
               ->add('where', 'b.reviewed = 1')
               ->add('where', 'b.enabled = 1')
               ->addOrderBy('b.name', 'ASC');

        // ...
}

也不起作用......

任何提示?

2 个答案:

答案 0 :(得分:28)

我会这样写:

$qb = $this
    ->createQueryBuilder('c')
    ->where('c.tags LIKE :tag')
    ->andWhere('c.reviewed = 1')
    ->andWhere('c.enabled = 1')
    ->setParameter('tag', "%{$tag}%")
    ->orderBy('c.clicks', 'DESC')
    ->addOrderBy('b.name', 'ASC');

if ($limit) {
    $qb->setMaxResults($limit);
}

return $qb->getQuery()->getResult();

您还可以将这些where条件统一起来:

->where('c.tags LIKE :tag AND c.reviewed = 1 AND c.enabled = 1')

答案 1 :(得分:6)

manual开始,建议的方式如下:

$qb->select(array('c'))
   ->where($qb->expr()->orx(
       $qb->expr()->eq('c.reviewed', 1),
       $qb->expr()->eq('c.enabled', 1),
       $qb->expr()->like('c.tags', '?1')
   ))
   ->orderBy('c.clicks', 'DESC'));