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アプリで機能させるか、エンティティに正しく注釈を付ける方法を支援して、BogenAntwortenとBogenFragenの間の正しい結合接続を作成したいと思います(3と1はパラメーターです。知る)。すべてのエンティティに OneToMany および ManyToOne アノテーションを既に設定していますが、右/左結合を機能させるには何かが必要です。

エンティティの設計を手伝ってくれる場合:

私には (表 BogenAntworten) 質問 (表 BogenFragen) に答える人 (表 Person) がいて、質問のリストを表示すると、その質問から最後の回答を取得する (保存時に更新が必要) か、何もなく、私がしなければならない作成します(保存時に挿入)。また、質問は多くのタイプ (表 BogenTyp) の 1 つにあり、多くのグループ (表 BogenFragenGruppe) の 1 つにあります。

何か案は?

4

1 に答える 1

4

わかりました、また自分で見つけました。Doctrine2 の QueryBuilder は leftJoin をサポートします (これは、2 つのテーブルを切り替えた場合の 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 に答える