web-dev-qa-db-fra.com

passer un tableau de conditions à doctrine expr () -> méthode orx ()

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?

36
Bartosz Rychlicki

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));
12
Bartosz Rychlicki

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);
68
DEY

@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);
11
Wilt

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));
5
Karol Gasienica

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.

1
Jens