Как реализовать подзапросы в Symfony2 с Doctrine?

Мне нужно посчитать количество элементов, возвращаемых в подзапросе. Если я напишу подзапрос как DQL — все хорошо, но если я попытаюсь построить запрос через QueryBuilder — я получу ошибку.

Подзапрос DQL:

$qb3 = $this->createQueryBuilder('c')
->select('COUNT(c.id)')
->where('c.id IN (SELECT cl.id FROM Acme\AppBundle\Entity\ClassC cl INNER JOIN Acme\AppBundle\Entity\ClassP p WHERE p.var1 = :var1 AND p.var2 = cl.id GROUP BY cl.id)')
->setParameter('var1', $var);

Подзапрос через QueryBuilder:

$qb = $this->createQueryBuilder('c');
$qb->select('COUNT(c.id)')
->where(
$qb->expr()->in(
'c.id',
$this->createQueryBuilder('cl')
->select('cl.id')
->innerJoin('Acme\AppBundle\Entity\ClassP', 'p')
->where('p.var1 = :var1')
->setParameter('var1', $var)
->andWhere('p.var2 = cl.id')
->groupBy('cl.id')
->getDQL()
)
);

Обе версии возвращают один и тот же DQL.

Ошибка:
экран

2

Решение

Попробуй двигаться setParameter() на основной уровень запроса.

$qb = $this->createQueryBuilder('c');
$qb->select('COUNT(c.id)')
->where(
$qb->expr()->in(
'c.id',
$this->createQueryBuilder('cl')
->select('cl.id')
->innerJoin('Acme\AppBundle\Entity\ClassP', 'p')
->where('p.var1 = :var1')
->andWhere('p.var2 = cl.id')
->groupBy('cl.id')
->getDQL()
)
)
->setParameter('var1', $var);
5

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

Других решений пока нет …

По вопросам рекламы [email protected]