在Doctrine2中使用DQL,如何仅为具有特定标记的产品选择产品及其标记?

时间:2012-11-09 18:17:00

标签: doctrine doctrine-orm dql

我有一个简单的数据模型:Product可以有很多Tag个对象。

标记模型有tag字段和value字段,两个字符串(此处值不重要)。

以下DQL查询获取所有产品及其标签:

SELECT p, t FROM Product p LEFT JOIN p.tags t

但是,我如何只选择具有特定标签的产品(例如“蓝色”)?我得到退回产品的所有标签非常重要,因此我不能简单地执行WHERE t.tag = 'blue'

作为一个附带问题;你有没有想过用一个单独的Tag表来实现它是否更好,然后让一个ProductTag表将它们编织在一起(适当的多对多关系)?

1 个答案:

答案 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获得了所有用于此的信息,我认为它在独立版本中也会起作用。

如果不起作用告诉我错误,我会仔细研究这个问题。