Doctrine orm 同一表列上的多个WHERE条件

Doctrine orm 同一表列上的多个WHERE条件,doctrine-orm,doctrine,dql,doctrine-query,Doctrine Orm,Doctrine,Dql,Doctrine Query,我正在尝试获取具有某些属性的零件。每个部分都有许多属性,每个属性都有一个属性头。所以我需要用三张桌子 SELECT * FROM Part p LEFT JOIN p.attributes pa JOIN pa.attributeheader pah WHERE (sph.name = 'size' AND sp.value IN ('11')) AND (sph.name = 'colour' AND sp.value IN ('Black')) 这不会返回任何结果,因为我在连接的某个地

我正在尝试获取具有某些属性的零件。每个
部分
都有许多属性,每个
属性
都有一个
属性头
。所以我需要用三张桌子

SELECT * FROM Part p 
LEFT JOIN p.attributes pa
JOIN pa.attributeheader pah
WHERE (sph.name = 'size' AND sp.value IN ('11')) 
AND (sph.name = 'colour' AND sp.value IN ('Black'))
这不会返回任何结果,因为我在连接的某个地方出错,或者缺少分组。我试图选择具有这两个属性的部件,因此使用
不是解决方案。我不太清楚该怎么做——使用原始MySQL,我会在连接中使用别名

WHERE (sph.name = 'size' AND sp.value IN ('11'))
AND (sph.name = 'colour' AND sp.value IN ('Black'))
相当于

WHERE sph.name = 'size' AND sp.value IN ('11') 
AND sph.name = 'colour' AND sp.value IN ('Black')
当然sph.name不能同时等于'size'和'color',因此您永远不会从该选择中获得任何行

您需要连接属性表两次

大致是这样的:

SELECT * FROM (Part p 
LEFT JOIN p.attributes pa
JOIN pa.attributeheader pah)
LEFT JOIN p.attributes pa2
JOIN pa.attributeheader pah2
您需要在WHERE子句中的值前面加上pa.或pa2。等等


也许你不应该在关系数据库中执行这样的查询,而应该在数据仓库或支持刻面的索引搜索引擎中执行。

我不知道Dority可以用这种方式使用多个别名,我会试试。我不说DQL(因此“或多或少是这种方式”)但是它是使用SQL工作的,因此doc可能会提供这样的功能。doc()为join()和leftJoin()函数显示了一个“alias”参数,所以这应该是正确的。