6

我有以下工作 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 迫使我思考对象,但我找不到任何建议如何标记我的实体以使其工作。

所以我想让上面的 MySQL 查询在我的 Symfony2 应用程序中工作,或者帮助如何正确注释我的实体,所以我在 BogenAnworten 和 BogenFragen 之间有一个工作正确的连接连接(3 和 1 是参数,所以你知道)。我已经为我的所有实体设置了 OneToMany 和 ManyToOne 注释,但是我需要一些东西来使右/左连接工作。

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

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

有任何想法吗?

4

1 回答 1

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 语句的数字)

于 2012-11-14T13:22:17.903 回答