如何在查询生成器中编写此查询?

时间:2013-01-17 20:45:26

标签: symfony doctrine-orm query-builder

我有以下(示范)查询:

SELECT *
FROM User u
LEFT JOIN section_user su ON (su.user_id = u.id AND su.section_id = 3)
WHERE section_id is null

我正在尝试使用查询构建器在用户和部分之间的多对多关系中在Symfony2中重建它,但我失败了。

我认为它看起来像这样,证明是错误的:

$er->createQueryBuilder('u')
    ->leftJoin('u.sections', 's', 'WITH', 's = :section')
    ->where('s is null')
    ->setParameter('section', $section);

非常感谢帮助!

3 个答案:

答案 0 :(得分:0)

首先,WHERE section_id is null没有多大意义,
section_id来自哪里?
如果它来自section_user,则它不能同时为3并且为null。;)
如果它来自用户那么它是一对多关系而不是多对多......

或许有点澄清你想要完成的事情。

基本上它的工作方式如下:(左边是Doctrine,右边是Sql)

$er->createQueryBuilder('u')      -> SELECT * FROM user u
   ->leftJoin('u.sections', 'us') -> LEFT JOIN section_user su ON u.id = su.user_id
                                     LEFT JOIN section s ON s.id = su.section_id 
   ->where('us.id = :section')    -> WHERE s.id = :section
   ->setParameter('section', 4);

答案 1 :(得分:0)

# Receive Doctrine query builder
$qb = $this->getDoctrine()->getEntityManager()->createQueryBuilder(); 

$qb
   ->select('u')
   ->from('NameBundle:User', 'u')
   ->leftJoin('u.section_user', 'su', \Doctrine\ORM\Query\Expr\Join::WITH, 'su.user_id = u.id AND (su.section_id IS NULL OR su.section_id = :section)'); # Join condition
   ->setParameter('section', $section);

答案 2 :(得分:0)

我认为这与here中的情况相同 但我看到你在leftJoin语句中需要两个条件,试试这个 (我假设两个实体中的身份密钥都是id

$qb->select('u')
 ->from('NameBundle:User','u')
 ->leftJoin('u.sections','su','ON'
    $qb->expr()->andx($qb->expr()->eq('u.id', 'su.user_id'), $qb->expr()->eq('su.id', ':section'))
   )
 ->having('COUNT(su.id) = 0')
 ->groupBy('u.id')
 ->setParameter('section',$section_id);

这将使所有尚未与身份$section_id

部分相关的用户获得

编辑:我刚注意到你的示例查询没有任何意义,因为它总是不返回任何内容。但我想您想要的是未分配到$section_id

部分的用户