我有一个简单的数据模型:Product
可以有很多Tag
个对象。
标记模型有tag
字段和value
字段,两个字符串(此处值不重要)。
以下DQL查询获取所有产品及其标签:
SELECT p, t FROM Product p LEFT JOIN p.tags t
但是,我如何只选择具有特定标签的产品(例如“蓝色”)?我得到退回产品的所有标签非常重要,因此我不能简单地执行WHERE t.tag = 'blue'
。
作为一个附带问题;你有没有想过用一个单独的Tag表来实现它是否更好,然后让一个ProductTag表将它们编织在一起(适当的多对多关系)?
答案 0 :(得分:1)
您可以像这样使用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项目中尝试了这个,它就像这样工作。因为我从Doctrine Documentation获得了所有用于此的信息,我认为它在独立版本中也会起作用。
如果不起作用告诉我错误,我会仔细研究这个问题。