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();
Источник
- Log in to post comments
- 3182 reads