0

我想使用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 代替?

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

4

2 回答 2

0

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

但是,要回答您的问题,我相信您不需要在 SELECT 上进行 JOIN。简单地说,加入StudentClasses,然后在 WHERE 中添加一个条件$year!WHERE 子句就是为此而设计的。

于 2013-01-12T15:25:35.850 回答
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');
于 2017-12-05T12:18:37.990 回答