我有以下可用的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
现在我在Doctrine2DQL或QueryBuilder中需要这个。我已经了解到D2迫使我在对象中思考,但我找不到任何关于如何标记我的实体以使其发挥作用的建议。
所以我想让上面的MySQL查询在我的Symfony2应用程序中运行,或者帮助我正确地注释我的实体,这样我就可以在BogenAntworten和BogenFragen之间建立一个正确的连接(3和1是参数,只是为了让你知道)。我已经为我的所有实体设置了OneToMany和ManyToOne注释,但我需要一些东西来使右/左联接工作。
如果你想帮助我的实体设计:
我有人(表Person)回答(表BogenAntworten)问题(表Bogen Fragen),当我显示问题列表时,我要么得到该问题的最后一个答案(保存时需要更新),要么没有答案,我必须创建它(保存时插入)。问题也属于多种类型中的一种(BogenTyp表),也属于多种组中的一组(BogenFragenGruppe表)
有什么想法吗?
好吧,我自己又发现了。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语句的数字)