Как совместить и где, или где с критериями доктрин

Я хочу создать довольно сложный и гибкий запрос с доктринами Criteria, у меня есть andWhere это входит в каждый запрос, но затем (в зависимости от ввода) я хочу добавить некоторые дополнительные параметры с orWhere,

$criteria = Criteria::create();

/* Add Criteria for last 55 Days (every query) */
$criteria->where(Criteria::expr()->gte('gameCreation', $long));

/* Gather optional Params */
$orxList = array();

/* Optional Criteria */
if (!empty($champions)) {
foreach ($champions as $c) {
$orxList[] = Criteria::expr()->eq('champion',$c);
}
}

...
$criteria->andWhere(Criteria::expr()->orX($orxList));

Это приводит к исключению:

Нет выражения для CompositeExpression.

Как бы я совмещал такой критерий с начальным where статья?

1

Решение

Я столкнулся с подобной проблемой и решил ее так:

use Doctrine\Common\Collections\Expr\CompositeExpression;
...

/* Gather optional Params */
$orxList = array();

/* Optional Criteria */
if (!empty($champions)) {
foreach ($champions as $c) {
$orxList[] = Criteria::expr()->eq('champion', $c);
}
}

...
$criteria->andWhere(new CompositeExpression(CompositeExpression::TYPE_OR, $orxList));

Как вы видите конструктор CompositeExpression принимает массив выражений, и это генерирует правильный запрос.

2

Другие решения

Вы должны использовать orX() из класса Expr для этого, пример:

$orX = $exp->orX();
$index = 0;

foreach ($champions as $c) {
$paramName = ':param_' . $index;
$orX->add($qb->expr()->eq('u.column', $paramName));
$qb->setParameter($paramName, $c);

$index++;
}

Однако, если ваш массив представляет собой просто строки / объект, сравниваемые таким же образом, рассмотрите возможность использования выражения WHERE IN [].

1