2012-02-01 15 views
52
WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2) 

¿Cómo puedo hacer esto en Doctrine?Cómo usar andWhere y orWhere in Doctrine?

$q->where("a = 1"); 
$q->andWhere("b = 1") 
$q->orWhere("b = 2") 
$q->andWhere("c = 1") 
$q->orWhere("d = 2") 

esto no es correcta ... debe ser:

$q->where("a = 1"); 
$q->andWhere("b = 1") 
    $q->orWhere("b = 2") 
$q->andWhere("c = 1") 
    $q->orWhere("d = 2") 

pero ¿cómo puedo hacerlo? En Propel es la función getNewCriterion, y en Doctrine ...?

Respuesta

82
$q->where("a = 1") 
    ->andWhere("b = 1 OR b = 2") 
    ->andWhere("c = 2 OR c = 2") 
    ; 
+6

Entonces ¿por qué no poner todo en el 'donde()' llamar? – MatBailie

+3

No estaría satisfecho con este tipo de sintaxis ... ¿Qué pasa si intenta migrar a algún tipo de "SQL" enfermo, donde 'OR' se reemplazará por' || '... ¿Cómo funciona esto, cuando necesitas usar 'b =? O b =? ' – Vyktor

+0

@Dems Sí, ciertamente es posible. Este método es más rápido, sin embargo. – Maerlyn

11

¿Por qué no

$q->where("a = 1"); 
$q->andWhere("b = 1 OR b = 2"); 
$q->andWhere("c = 1 OR d = 2"); 

EDITAR: También puede utilizar el Expr class (Doctrine2).

+0

La pregunta es para la doctrina 1.2, los documentos que ha vinculado son para 2.0. – Maerlyn

+4

@Maerlyn, bueno, la pregunta no tiene la etiqueta 'doctrine-1.2', así que no puedo estar seguro de cuál quiere decir el usuario, en ese caso espero implícitamente la más reciente. – Czechnology

+0

Mi error, no sabía que había y dónde y dónde está el creador de consultas de doctrine2. – Maerlyn

39

He aquí un ejemplo para aquellos que tienen condiciones más complicadas y utilizando Doctrina 2. * con QueryBuilder:

$qb->where('o.foo = 1') 
    ->andWhere($qb->expr()->orX(
     $qb->expr()->eq('o.bar', 1), 
     $qb->expr()->eq('o.bar', 2) 
    )) 
    ; 

Esas son expresiones mencionadas en respuesta Czechnology.

+1

me ayudó. aplausos :) – Sharpy35

+0

life saver :) gracias – Hooli

0

Una cosa que falta aquí: si tiene un número variable de elementos que desea juntar a algo así como

WHERE [...] AND (field LIKE '%abc%' OR field LIKE '%def%') 

y no quiero montar un DQL cuerdas a sí mismo, se puede utilizar el orX mencionado por encima de la siguiente manera:

$patterns = ['abc', 'def']; 
$orStatements = $qb->expr()->orX(); 
foreach ($patterns as $pattern) { 
    $orStatements->add(
     $qb->expr()->like('field', $qb->expr()->literal('%' . $pattern . '%')) 
    ); 
} 
$qb->andWhere($orStatements); 
Cuestiones relacionadas