2012-01-16 98 views
10

我使用下面的方法在一個庫類來尋找我的數據庫中的某些標籤:的Symfony2 /學說的QueryBuilder使用andwhere()

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個額外的變量(其中:審查= 1,啓用= 1)?我嘗試和where(),但我無法弄清楚。

我也發現了這樣的事情:

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

     // ... 
} 

將無法​​工作要麼...

任何提示?

回答

27

我會寫這樣的:

$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') 
+0

謝謝elnur,是addOrderBy()與orderBy()有什麼不同? – Mike 2012-01-18 15:08:24

+0

我相信addOrderBy是用來連接orderBy的邏輯。例如,如果你想要2個orderBy參數,第一個參數是'orderBy',然後是'addOrderBy'。與where子句的作用相同。首先是 - >在哪裏,然後所有以下都寫成' - > addWhere'。 – 2014-01-23 22:26:25

5

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')); 
+0

好的,謝謝你的xdazz +1! – Mike 2012-01-18 15:08:04