1

我有以下(示例性)查询:

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);

非常感谢帮助!

4

3 回答 3

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);
于 2013-01-18T05:37:24.483 回答
0

首先,WHERE section_id is null没有多大意义,
section_id 是从哪里来的?
如果它来自 section_user,那么它不能同时是 3 和 null.. ;)
如果它来自 User,那么它是一对多关系而不是多对多关系......

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

基本上它是这样工作的:(左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);
于 2013-01-17T23:59:40.163 回答
0

我认为这与此处的情况相同 但是我看到您在 leftJoin 语句中需要 2 个条件,试试这个(我假设两个实体中的身份密钥都是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);

这将获取所有尚未与 id 部分相关的用户$section_id

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

于 2013-01-18T16:39:30.477 回答