2012-01-16 15 views
10

używam następujące metody w klasie repozytorium szukać niektórych znaczników w mojej bazy danych:Symfony2/Doctrine QueryBuilder użyciu 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(); 
} 

ten działa tylko ładne .. Ale: Jak mogę dodać 2 dodatkowe zmienne (gdzie: checked = 1, enabled = 1)? Próbowałem andwhere(), ale nie mogłem tego rozgryźć.

Dowiedziałem się też, że coś takiego:

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

     // ... 
} 

nie będzie działać albo ...

żadnych wskazówek?

Odpowiedz

27

chciałbym napisać to tak:

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

Można też łączyć te where warunki:

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

dziękuje elnur, czy addOrderBy() różni się od orderBy()? – Mike

+0

Uważam, że addOrderBy jest używany jest łączenie logiki z orderBy. Na przykład, jeśli chcesz mieć 2 parametry orderBy, pierwsze będzie "orderBy", a następnie "addOrderBy". Działa tak samo, jak klauzula where. Pierwszy to -> gdzie, następnie wszystkie następne są zapisywane "-> addWhere". –

5

Z manual, zaproponowany sposób jest jak poniżej:

$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

Ok, dzięki za xdazz +1! – Mike

Powiązane problemy