我想使用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吗?
任何帮助将不胜感激, 感谢。
答案 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');