English 中文(简体)
选择查询构建器左侧加入
原标题:Doctrine2 Query Builder Left Join with Select

我想使用理论2查询构建程序执行 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();

还是我应该使用本地SQL 来代替?

any help would be appreciated, thanks.

问题回答

您想要做的事非常有趣, 因为与 DQL 或 QueryBuilder 的理论2 似乎并不支持 SELECT 上的合作。 当然, 您可以尝试使用 < a href=" http://www.doctrine- project. org/blog/doctrine2- native-queries. html " rel= "nofollow" 。

然而,为了回答你的问题,我认为你不需要在某个专业上联合起来。简单地说,在 " 学生分类 " 上联合起来,然后在 " 年度 " 上添加一个条件。

您可以使用 WITH 条款加入实体, 附加检查 。 对于您的子查询, 您可以使用与年份过滤器的左侧连接来写入相同内容 。 在加入 i 部分使用 c. studentClasses , 假设在 Classes 实体中, 您为 < code> 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 );




相关问题
Zend and static class properties

I m trying to assign a value to a static class property when defining it: namespace Base; abstract class Skeleton { protected static $entityManager = end_Registry::get("EntityManager"); ......

require_once missing doctrine zend framework

I m integrating doctrine with Zend Framework. I ve hit an error thrown from cli. It seems Zend_Application_Bootstrap_Bootstrap does not have a require_once for ...

doctrine: QueryBuilder vs createQuery?

In Doctrine you can create DQL in 2 ways: EntityManager::createQuery: $query = $em->createQuery( SELECT u FROM MyProjectModelUser u WHERE u.id = ?1 ); QueryBuilder: $qb->add( select , u ) ...

热门标签