doctrine QueryBuilder -- Как передать параметр в подзапрос. expr->orX()
Primary tabs
Как построить сложный подзапрос expr()->... смотри здесь.
Метод setParameter() нельзя включить в цепочку после добавления части подзапроса, т.к.
($qb->expr()->orX())->add()
не возвращает QueryBuilder-объект, чьим методом является setParameter().
Это создаёт проблему, когда мы заранее не знаем, передан ли тот или иной параметр в работу, и следовательно, будет ли добавлена соответствющая часть в подзапрос.
Тогда добавляем setParameter() отдельной строкой, вызываю его у того объекта, который ему нужен, и в том месте, где нам нужно:
// Где-то в начале запроса мы создали QueryBuilder
$qb = $this->getEntityManager()
->createQueryBuilder();
// Дальше как-то создавали запрос
// ...
// Тут нам понадобился подзапрос
$orX = $qb->expr()->orX();
// Добавляем в него условия
if (!empty($sum)) {
$orX->add("s.sum = :sum");
// сетим параметр также внутри <em>if</em>, во избежании использования необъявленных переменных
$qb->setParameter('sum', $sum);
}
// Присоединяем подзапрос к основному запросу
$query->andWhere($orX);
// И получаем результат
return $query->orderBy('s.id', 'ASC')
// здесь уже не сетим параметры, т.к. сделали это выше
->getQuery()
->getResult();Источник
- https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#binding-parameters-to-your-query
- Log in to post comments
- 3846 reads