2012-07-28 10 views
22

muszę skonstruować DQL z QueryBuilder jak tenprzechodzą szereg warunków do doktryny expr() - metoda> Orx()

[QUERY]... AND WHERE e.type = x OR e.type = Y OR e.type = N [...] 

mam typów w tablicy Jak mogę przekazać tę tablicę do mojego konstruktora zapytań ?

$qb->andWhere($qb->expr()->orx(CONDITIONS)); 

Lista typów będzie dynamiczny, nazywając $qb->andWhere na każdej pętli foreach typy uczyni tylko więcej i gdzie ma więcej RNO.
Czy mogę przechowywać wyrażenia o wielu numerach orx, a następnie dodać je do andWhere? Jakiś pomysł, jak rozwiązać ten, prawdopodobnie, powszechny problem?

Odpowiedz

5

Wiedziałem, że tommarow będzie lepszym dniem. Rozwiązanie jest proste. Twój może zrobić tablicę lub wyrażenia jak tak

$ors[] = $qb->expr()->orx('e.type = '.$qb->expr()->literal($value)); 

A potem wystarczy dodać go do andWhere()/Gdzie() metody konstruktora zapytań poprzez dołączyć metodę tak:

$qb->andWhere(join(' OR ', $ors)); 
50

mam taką nadzieję, a potem znalazłem to:

$conditions = array('e.type = x', 'e.type = Y', 'e.type = N'); 
$orX = $qb->expr()->orX(); 

foreach ($conditions as $condition) { 
    $orX->add($condition); 
} 

$qb->add('where', $orX); 

Korzystanie @meze sugestię, można uprościć kod i zastąpić foreach oświadczenie z:

$orX->addMultiple($conditions); 
+16

każdy dzień jest lepiej niż wcześniej, foreach można zastąpić '$ orX-> addMultiple ($ conditions); ' – meze

+1

Zmieniłem odpowiedź na wiki społeczności. @meze, możesz edytować go ze zmianami. – DEY

5

@DEY jego odpowiedź można uprościć. Nie potrzeba foreach, to działa również:

$conditions = array('e.type = x', 'e.type = Y', 'e.type = N'); 

$orX = $qb->expr()->orX(); 
$orX->addMultiple($conditions); 

$qb->where($orX); 
0

Można również użyć ... w php jak:

$conditions = array('e.type = x', 'e.type = Y', 'e.type = N'); 
$criteria = Criteria::create(); 
$criteria->andWhere(Criteria::expr()->orX(...$conditions));