如何使用Doctrine在Symfony2中实现子查询?

And*_*ost 2 php query-builder doctrine-query symfony doctrine-orm

我需要计算子查询中返回的项目数.如果我写子查询如何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);
Run Code Online (Sandbox Code Playgroud)

通过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()
     )
 );
Run Code Online (Sandbox Code Playgroud)

两个版本都返回相同的DQL.

错误: 屏幕

Paw*_*zuk 5

尝试移动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);
Run Code Online (Sandbox Code Playgroud)