Symfony2/Doctrine QueryBuilder使用andwhere()

12

我在一个仓库类中使用以下方法来在我的数据库中查找特定的标签:

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

这个代码非常好用。但是我该如何添加两个额外的变量(其中:reviewed = 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个回答

31

我会这样写:

$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
我相信addOrderBy是用于将逻辑连接到orderBy中的。例如,如果您想要2个orderBy参数,则第一个将是'orderBy',然后是'addOrderBy'。与where子句的工作方式相同。第一个是->where,然后所有后续内容都写为'->addWhere'。 - Carey Estes
1
谢谢,省了我一些时间。 - Pierrick Martellière

6

手册中可以看到,建议的方法如下:

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

好的,谢谢xdazz,也+1了! - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接