2012-05-25 51 views
0

加入我想用doctrine2查詢生成器來實現這個SQL:Doctrine2查詢生成器左移選擇

SELECT c.*, COUNT(s.id) AS studentCount 
FROM classes c 
LEFT JOIN (
    SELECT * 
    FROM student_classes 
    WHERE YEAR = '2012' 
) sc ON c.id = sc.class_id 
LEFT JOIN students s ON sc.student_id = s.id 
GROUP BY c.id 

我想這一個,但沒有奏效

$qb = $this->getEntityManager() 
    ->getRepository('Classes') 
    ->createQueryBuilder('c'); 
$qb->select('c.id AS id, c.name AS name, COUNT(s) AS studentCount'); 
$qb->leftJoin(
    $qb->select('sc1') 
     ->from('StudentClasses', 'sc1') 
     ->where('sc1.year = :year') 
     ->setParameter('year', $inputYear), 
    'sc2' 
); 
$qb->leftJoin('sc2.students', 's'); 
$qb->groupBy('c.id'); 
return $qb->getQuery()->getScalarResult(); 

,或者我應該使用nativeSQL將代替?

任何幫助,將不勝感激, 謝謝。

回答

0

你想要做什麼非常有趣,因爲在SELECT上JOIN似乎不被DQL或QueryBuilder的Doctrine2支持。當然,您可以嘗試使用native query

但是,要回答您的問題,我相信您不需要在SELECT上進行JOIN。只需加入StudentClasses,然後在WHERE關於$year添加條件! WHERE子句是爲了這個。

0

您可以使用WITH條款加入實體額外的檢查,爲了您的子查詢,你可以寫同樣的使用留下了一年過濾器聯接,在加入我都基於這樣的假設:Classes實體你有一些映射使用c.studentClasses部分物業StudentClasses實體

$qb = $this->getEntityManager() 
    ->getRepository('Classes') 
    ->createQueryBuilder('c'); 
$qb->select('c.id AS id, c.name AS name, COUNT(s) AS studentCount'); 
$qb->leftJoin('c.studentClasses','sc2', 'WITH', 'sc2.year = :year'); 
$qb->leftJoin('sc2.students', 's'); 
$qb->setParameter('year', $inputYear); 
$qb->groupBy('c.id'); 
相關問題