0

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

Tag 模型有一个tag字段和一个value字段,都是字符串(值在这里并不重要)。

以下 DQL 查询为我提供了所有产品及其标签:

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

但是,我如何只选择具有特定标签(例如“蓝色”)的产品?获取退回产品的所有标签很重要,所以我不能简单地做一个WHERE t.tag = 'blue'.

作为一个附带问题;您是否有任何想法是否最好使用单独的 Tag 表来实现这一点,然后让 ProductTag 表将它们编织在一起(正确的多对多关系)?

4

1 回答 1

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'
)"

这将返回在其标签集合中找到 a 的所有产品对象Tag.tag = 'blue',但也会加入其他标签。

我在Symfony2项目中尝试过这个,它就像这样工作。因为我从Doctrine 文档中获得了用于此的所有信息,所以我认为它在独立版本中也可以使用。

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

于 2012-11-09T22:50:35.523 回答