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

使用Doctrine2中的DQL,如何仅为具有特定标记的产品选择产品及其标记?,doctrine,doctrine-orm,dql,Doctrine,Doctrine Orm,Dql,我有一个简单的数据模型:一个产品可以有许多标记对象 标记模型有一个标记字段和一个值字段,这两个字符串(此处值不重要) 以下DQL查询获取所有产品及其标记: SELECT p, t FROM Product p LEFT JOIN p.tags t 但是,如何仅选择具有特定标签(例如“蓝色”)的产品?获取返回产品的所有标记非常重要,因此我不能简单地执行操作,其中t.tag='blue' 作为附带问题;您是否认为使用单独的标记表来实现这一点更好,然后使用ProductTag表将它们编织在一起(适当

我有一个简单的数据模型:一个
产品
可以有许多
标记
对象

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

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

SELECT p, t FROM Product p LEFT JOIN p.tags t
但是,如何仅选择具有特定标签(例如“蓝色”)的产品?获取返回产品的所有标记非常重要,因此我不能简单地执行
操作,其中t.tag='blue'


作为附带问题;您是否认为使用单独的标记表来实现这一点更好,然后使用ProductTag表将它们编织在一起(适当的多对多关系)?

您可以使用如下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'
的所有产品对象,但也会连接其他标签

我在一个项目中尝试了这个方法,结果是这样的。因为我从中获得了所有用于此的信息,所以我认为它在独立版本中也会起作用

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