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

Come posso farlo in Doctrine?Come utilizzare e dove e in Where in Doctrine?

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

questo non è corretto ... Dovrebbe essere:

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

ma come posso farlo? In Propel è la funzione getNewCriterion e in Doctrine ...?

risposta

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

Quindi perché non inserire tutto nella chiamata 'where()'? – MatBailie

+3

Non sarei soddisfatto di questo tipo di sintassi ... E se provassi a migrare ad un tipo di "SQL" malato dove "OR" sarà sostituito da "||" ... Come funziona, quando funziona? devi usare 'b =? OR b =? ' – Vyktor

+0

@Dems Sì, è certamente possibile. Questo metodo è più veloce, comunque. – Maerlyn

11

Perché non solo

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

EDIT: È inoltre possibile utilizzare il Expr class (Doctrine2).

+0

La domanda è per doctrine 1.2, i documenti che hai linkato sono per 2.0. – Maerlyn

+4

@Maerlyn, beh, la domanda non ha il tag 'doctrine-1.2', quindi non posso essere sicuro di quale sia l'utente: in questo caso implicitamente mi aspetto quello più attuale. – Czechnology

+0

Il mio errore, non sapevo che ci fosse e dove e ovunque nel generatore di query di doctrine2. – Maerlyn

39

Ecco un esempio per coloro che hanno condizioni più complicate e utilizzando Doctrine 2. * con QueryBuilder:

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

Queste sono le espressioni di cui Czechnology risposta.

+1

mi ha aiutato. evviva :) – Sharpy35

+0

salva la vita :) grazie – Hooli

0

Una cosa che manca qui: se si dispone di un numero variabile di elementi che si desidera mettere insieme per qualcosa come

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

e non voglio assemblare un DQL-String da soli, è possibile utilizzare il orX menzionato sopra in questo modo:

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