2016-02-24 30 views
2

我需要計算子查詢中返回的項目數。如果我寫子查詢如何DQL - 都很好,但如果我嘗試通過QueryBuilder建立查詢 - 我得到一個錯誤。如何使用Doctrine在Symfony2中實現子查詢?

子查詢DQL:通過QueryBuilder的

$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); 

子查詢:

$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。

錯誤: screen

回答

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); 
+0

它的工作原理。謝謝! –

相關問題