2013-01-17 98 views
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); 

帮助非常感谢!

回答

0

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

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

基本上它的工作原理是这样的:(左学说,右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); 
+0

对不起,这不是我正在寻找的。这是一个左连接。因此,如果不是3,那么该值将是'NULL'。 – sprain

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

这导致'User没有名为section_user的关联',这对我来说似乎是一个逻辑错误。 – sprain

+0

Doctrine 2映射使用camelcase nontation,所以使用u.sectionUser(在您的实体中查看右边的字段名称) – Adamamont

0

我觉得这是同样的情况在here 不过我看你需要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); 

这将让人l尚未关联的用户编号:$section_id

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

+0

我一回到相应的项目就会尝试这个。就像一个旁注:我的示例查询确实有意义,因为我已经彻底测试过它,它实际上确实会返回正确的数据。它是一个LEFT JOIN。因此,没有与第3部分对应的每个用户将具有NULL的section_id。而那些正是我正在寻找的。 – sprain

+0

嗯,我不确定..你加入'su.section_id = 3',只是返回行'section_id为空' – Broncha