2012-07-28 4 views
22

Ich brauche DQL mit einem QueryBuilder wie diesePass Reihe von Bedingungen Lehre expr() -> orx() -Methode

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

I-Typen in Array zu konstruieren Wie kann ich dieses Array meiner Query Builder übergeben ?

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

Liste der Arten wird dynamisch sein, $qb->andWhere auf jeder foreach Typen Schleife Aufruf wird nur mehr machen Und wo ist nicht mehr OPs.
Kann ich multiple orx Ausdrücke speichern und dann zu hinzufügen? Irgendeine Idee, wie man dieses, wahrscheinlich, allgemeine Problem löst?

Antwort

5

Ich wusste, dass Tommarow ein besserer Tag sein wird. Die Lösung ist einfach. Sie können von OR Ausdrücke machen Array wie so

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

Und dann fügen Sie ihn einfach zu UndWo()/Wo() -Methode des Query Builder über Verfahren beitreten wie so:

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

Sie können auch Verwenden Sie die call_user_func_array Funktion like this.

Sie können eine Methode aufrufen, die die Elemente eines Arrays als Parameter übergibt.

50

Ich hoffe, dann fand ich diese:

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

@meze Vorschlag verwenden, können Sie den Code vereinfachen und ersetzen Sie die foreach Erklärung mit:

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

Jeder Tag ist besser als vorher, kann foreach ersetzt werden durch '$ orX-> addMultiple ($ Bedingungen); ' – meze

+1

Ich habe die Antwort auf Community-Wiki geändert. @meze, du kannst es gerne mit deinen Änderungen bearbeiten. – DEY

5

@DEY seine Antwort kann vereinfacht werden. Keine Notwendigkeit für die foreach, dies auch funktioniert:

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

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

$qb->where($orX); 
0

Sie auch ... in php wie verwenden:

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