我有一个简单的数据模型: Product
可以具有许多 Tag
对象。
标签模型具有tag
字段和value
字段,两个字符串(在这里值不重要)。
以下DQL查询使我所有产品及其标签:
SELECT p, t FROM Product p LEFT JOIN p.tags t
但是,如何仅选择具有特定标签的产品(例如"蓝色")?重要的是要获得返回产品的所有标签,所以我不能简单地做WHERE t.tag = 'blue'
。
作为附带问题;您是否对使用单独的标签表进行实施,然后让产品标签表编织它们是否更好(适当的关系)?
您可以使用这样的DQL查询:
"SELECT p, t FROM Product p LEFT JOIN p.tags t WHERE p.id IN (
SELECT sp.id FROM Product sp INNER JOIN sp.tags st WHERE st.tag = 'blue'
)"
这将返回所有产品对象,其中在其标签集合中找到了Tag.tag = 'blue'
,但也加入了其他标签。
我在Symfony2项目中尝试了一下,它是这样的。因为我从学说文档中获得了所有用于此信息的信息,所以我认为它也可以在独立版本中使用。
如果它不起作用,请告诉我错误,我会仔细研究这个问题。