2012-01-16 11 views
10

estoy usando siguiente método en una clase repositorio para buscar ciertas etiquetas en mi base de datos:Symfony2/Doctrina QueryBuilder usando 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(); 
} 

Esto funciona simplemente agradable .. Pero: ¿Cómo puedo añadir 2 adicionales variables (donde: revisado = 1, habilitado = 1)? Intenté y dónde() pero no pude resolverlo.

También descubrí que algo como esto:

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

     // ... 
} 

tampoco funcionará ...

¿Alguna pista?

Respuesta

27

lo escribiría así:

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

También podría unir a los where condiciones:

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

gracias elnur, ¿addOrderBy() es diferente de orderBy()? – Mike

+0

Creo que addOrderBy se usa si concatenas la lógica del pedido. Por ejemplo, si quiere 2 parámetros orderBy, el primero sería 'orderBy', seguido de 'addOrderBy'. Funciona igual que la cláusula where. El primero es -> donde, entonces todos los siguientes están escritos '-> addWhere'. –

5

Desde el manual, la forma sugerida es como abajo:

$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, gracias xdazz +1 por eso también! – Mike

Cuestiones relacionadas