右键加入Doctrine2 for Symfony2

时间:2012-11-14 09:27:57

标签: sql symfony doctrine-orm

我有以下工作MySQL查询:

SELECT *
FROM bogenantworten a
    RIGHT JOIN
        bogenfragen f ON f.id = a.bogenfragen_id
        AND a.personen_id = 3,
    BogenTyp t, 
    BogenFragenGruppe g
WHERE
    t.id = f.fragentyp_id AND
    g.id = f.fragengruppen_id AND
    t.id = 1
ORDER BY f.sortierung ASC

现在我需要在Doctrine2 DQL或QueryBuilder中使用它。我已经知道D2强迫我在对象中思考,但我找不到任何关于如何标记我的实体以使其工作的建议。

所以我想要在我的Symfony2应用程序中使用上述MySQL查询或者如何正确注释我的实体,这样我就可以在BogenAntworten和BogenFragen(3和1是参数,只是你知道)。我已经为我的所有实体设置了OneToMany和ManyToOne注释,但我需要一些东西来使右/左连接起作用。

如果您想帮助我实体设计:

我有人(表人)回答(表BogenAntworten)问题(表BogenFragen),当我显示问题列表时,我要么从该问题得到最后答案(保存时需要更新),或者没有,我必须创建它(保存时插入)。问题也属于多种类型之一(表BogenTyp),并且属于众多组中的一个(表BogenFragenGruppe)

任何想法?

1 个答案:

答案 0 :(得分:4)

好的,再次发现自己。 Doctrine2的QueryBuilder支持leftJoin(如果你切换两个表,它与RIGHT JOIN相同)。对于那些需要一些代码的人来说,这里是使用QueryBuilder构建的上述SQL语句:

$query = $em->createQueryBuilder()
    ->select(array('f.id', 'f.frage', 'f.sortierung', 'a.antwort', 'g.name'))
    ->from('MySuperBundle:BogenFragen', 'f')
    ->leftJoin('f.bogenantworten', 'a', 'WITH', 'a.personen = :pid')
    ->from('MySuperBundle:BogenTyp', 't')
    ->from('MySuperBundle:BogenFragenGruppe', 'g')
    ->where('t.id = :tid')
    ->andWhere('t.id = f.bogentypen')
    ->andWhere('g.id = f.bogenfragengruppe')
    ->orderBy('f.sortierung', 'ASC')
    ->setParameter('tid', 1)
    ->setParameter('pid', 3)
    ->getQuery();

(参数实际上是动态的,但为了更容易阅读,我使用了原始SQL语句的编号)