Мне нужно построить DQL с QueryBuilder
как это
[QUERY]... AND WHERE e.type = x OR e.type = Y OR e.type = N [...]
У меня есть типы в массиве. Как передать этот массив в построитель запросов?
$qb->andWhere($qb->expr()->orx(CONDITIONS));
Список типов будет динамическим, вызов $qb->andWhere
в каждом цикле foreach будет делать только больше И WHERE больше нет OR.
Могу ли я хранить многократные выражения orx
а затем добавлять их в andWhere
? Любая идея, как решить эту, возможно, общую проблему?
Надеюсь, что так, тогда я нашел это:
$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, вы можете упростить код и заменить оператор foreach :
$orX->addMultiple($conditions);
Я знал, что tommarow будет лучшим днем. Решение прост. Вы можете сделать массив выражений OR таким образом
$ors[] = $qb->expr()->orx('e.type = '.$qb->expr()->literal($value));
А затем просто добавьте его в метод andWhere () / Where () построителя запросов с помощью метода join так:
$qb->andWhere(join(' OR ', $ors));
@DEY его ответ можно упростить. Нет необходимости в foreach, это также работает:
$conditions = array('e.type = x', 'e.type = Y', 'e.type = N'); $orX = $qb->expr()->orX(); $orX->addMultiple($conditions); $qb->where($orX);
Вы также можете использовать функцию call_user_func_array, как это .
Он позволяет вызывать метод, передающий элементы массива в качестве параметров.