これは架空の質問です。Doctrine ORM について理解を深めようとしていて、プレーンな SQL で行うことを再現するのに苦労しているためです。
タグと投稿の間に単純な多対多の関係があるとします。彼らは、それPost::tags
が所有側でTag::posts
あり、逆のマッピングであるようにマッピングします。
Doctrine の DQL を使用すると、タグを含む投稿、または次の 2 つのクエリで投稿を参照するタグを選択できることを理解しています
(1)SELECT p, t FROM MyBundle:Post p JOIN p.tags t WHERE p.id = :id
(2)SELECT t, p FROM MyBundle:Tag t JOIN t.posts p WHERE t.id = :id
しかし、いくつかのタグで投稿を取得したい場合は、次のいずれかを選択する必要があります。
(3)SELECT p, t FROM MyBundle:Post p JOIN p.tags t WHERE t.value IN ('foo','bar')
(4)SELECT t, p FROM MyBundle:Tag t JOIN t.posts p WHERE t.value IN ('foo','bar')
これらはどちらも間違っているようです。
(3)を使用すると、DBは投稿テーブル全体をスキャンしてから、セットをタグ付けされたものに減らすと思います
(4) を使用すると、タグ オブジェクトのコレクションが返されます。これは、求めているものとは逆です。
論理的には、SQLで行うことを反映しているように見えたので、次のことを試しました。
SELECT p, pt FROM MyBundle:Tag t JOIN t.posts p JOIN p.tags pt
WHERE t.value IN ('foo','bar') GROUP BY p.id
Doctrine がルート エンティティを選択すると主張するため、機能しません。
タグを選択し、一意の投稿を完全なオブジェクトとして返す最良の方法は何ですか?