J'ai besoin de construire DQL avec un QueryBuilder
comme celui-ci
[QUERY]... AND WHERE e.type = x OR e.type = Y OR e.type = N [...]
J'ai des types dans le tableau Comment puis-je transmettre ce tableau à mon générateur de requêtes?
$qb->andWhere($qb->expr()->orx(CONDITIONS));
La liste des types sera dynamique, appelant $qb->andWhere
sur chaque boucle foreach types ne fera que plus ET O WH il n'y a plus de OU.
Puis-je stocker plusieurs expressions orx
puis les ajouter à andWhere
? Une idée de comment résoudre ce problème, probablement commun?
Je savais que demain allait être une meilleure journée. La solution est simple. Vous pouvez créer un tableau d'expressions OR comme ceci
$ors[] = $qb->expr()->orx('e.type = '.$qb->expr()->literal($value));
Et puis il suffit de l'ajouter à la méthode andWhere ()/Where () du générateur de requêtes via la méthode join comme ceci:
$qb->andWhere(join(' OR ', $ors));
J'espère que oui, alors j'ai trouvé ceci:
$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);
En utilisant la suggestion @meze, vous pouvez simplifier le code et remplacer l'instruction foreach par:
$orX->addMultiple($conditions);
@DEY sa réponse peut être simplifiée. Pas besoin de foreach, cela fonctionne aussi:
$conditions = array('e.type = x', 'e.type = Y', 'e.type = N');
$orX = $qb->expr()->orX();
$orX->addMultiple($conditions);
$qb->where($orX);
Vous pouvez aussi utiliser ...
en php comme:
$conditions = array('e.type = x', 'e.type = Y', 'e.type = N');
$criteria = Criteria::create();
$criteria->andWhere(Criteria::expr()->orX(...$conditions));
Vous pouvez également utiliser la fonction call_user_func_arraycomme celle-ci .
Il vous permet d'appeler une méthode en passant les éléments d'un tableau en tant que paramètres.