这是一个假设性的问题,因为我试图了解 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)我想数据库会先扫描整个帖子表,然后再将集合减少到标记的那些
使用(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 坚持我选择根实体
在标签上选择但将唯一帖子作为完整对象取回的最佳方法是什么?