Подтвердить что ты не робот

Передать массив условий методу doctring expr() → orx()

Мне нужно построить 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 будет делать только больше И ГДЕ больше OR.
Могу ли я хранить умножить выражения orx, а затем добавить их в andWhere? Любая идея, как решить эту, возможно, общую проблему?

4b9b3361

Ответ 1

Я знал, что tommarow будет лучшим днем. Решение прост. Вы можете сделать массив выражений OR таким образом

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

А затем просто добавьте его в метод andWhere()/Where() построителя запросов с помощью метода join так:

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

Ответ 2

Надеюсь, что так, тогда я нашел это:

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

Ответ 3

@DEY его ответ можно упростить. Нет необходимости в foreach, это также работает:

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

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

$qb->where($orX);

Ответ 4

Вы также можете использовать call_user_func_array функцию как это.

Позволяет вам вызывать метод, передающий элементы массива в качестве параметров.