Doctrine2查询生成器左连接选择

时间:2012-05-25 10:59:57

标签: doctrine-orm

我想使用doctrine2查询构建器实现此SQL:

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吗?

任何帮助将不胜感激, 感谢。

2 个答案:

答案 0 :(得分:0)

你想做什么真的很有趣,因为Doctrine2使用DQL或QueryBuilder似乎不支持SELECT上的JOIN。当然,您可以尝试使用native query

但是,为了回答你的问题,我相信你不需要在SELECT上进行JOIN。只需在StudentClasses上加入,然后在WHERE中添加关于$year的条件! WHERE子句是为此而生的。

答案 1 :(得分:0)

您可以使用WITH子句通过附加检查加入实体,对于您的子查询,您可以使用带有年份过滤器的左连接来编写相同的内容。在连接部分中,我使用c.studentClasses基于以下假设:在Classes实体中,您有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');