Это гипотетический вопрос, потому что я пытаюсь разобраться с Doctrine ORM и с трудом воспроизвожу то, что я сделал бы в простом SQL.
Предположим, у меня есть простая связь ManytoMany между тегами и сообщениями. Они будут отображать так, что Post::tags
будет стороной-владельцем, а Tag::posts
— обратным отображением.
Я понимаю, что с помощью DQL Doctrine я могу выбирать сообщения, содержащие их теги, или теги, ссылающиеся на их сообщения, с помощью следующих 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) я предполагаю, что БД будет сканировать всю таблицу сообщений, прежде чем сокращать набор до тех, которые помечены
С помощью (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 настаивает на том, чтобы я выбрал корневую сущность
Каков наилучший способ выбрать теги, но получить уникальные сообщения в виде полноценных объектов?
SELECT p FROM MyBundle:Post p JOIN p.tags t WHERE t.value IN ('foo', 'bar') GROUP BY p.id
? Какая информация от объекта вам нужна в конечном результате? - person Squazic   schedule 29.11.2012