因此,这是复制您在 SQL 中的内容的一种方法,但正如我在评论中提到的那样,可能有一种更有效的方法来做到这一点。如果您对我上面的评论问题提供答案,我会看看我是否可以改进这个答案。
首先,您的模式中需要一个交叉引用表。我会假设你这样做,并且它被称为AttributeValue
. 然后将您的联接添加到EntityQuery
并添加其他条件。
不幸的是,Propel 中似乎有一个错误会阻止下面的代码生成正确的 SQL。
$results = EntityQuery::create()
->join('Entity.AttributeValue avx')
->join('avx.Attribute xa')
->addJoinCondition('xa', 'xa.name = ?', 'X')
->join('Entity.AttributeValue avy')
->join('avy.Attribute ya')
->addJoinCondition('ya', 'ya.name = ?', 'Y')
->select(array('entity.name', 'avx.value', 'avy.value'));
这应该产生以下 SQL:
SELECT entity.name AS 'entity.name',
avx.value AS 'avx.value',
avy.value AS 'avy.value'
FROM `entity`
INNER JOIN `attribute_value` `avx` ON (entity.id = avx.entity_id)
INNER JOIN `attribute` `ax` ON (avx.attribute_id = ax.id AND ax.name = 'X')
INNER JOIN `attribute_value` `avy` ON (entity.id = avy.entity_id)
INNER JOIN `attribute` `ay` ON (avy.attribute_id = ay.id AND ay.name = 'Y')
不幸的是,这是生成的:
SELECT entity.name AS 'entity.name',
aatribute_value.value AS 'avx.value',
aatribute_value.value AS 'avx.value'
FROM `entity`
INNER JOIN `attribute_value` `avx` ON (entity.id = avx.entity_id)
INNER JOIN `attribute` `ax` ON (avx.attribute_id = ax.id AND attribute.name = 'X')
INNER JOIN `attribute_value` `avy` ON (entity.id = avy.entity_id)
INNER JOIN `attribute` `ay` ON (avy.attribute_id = ay.id AND attribute.name = 'Y')
(问题是SELECT
line 和INNER JOIN
on attribute
which usesattribute.name = 'X'
而不是正确的ax.name = 'X'
。)
因此,您可以使用手动查询运行正确的SQL,或者等待修复错误(我将尝试在 Guthub 上写一个问题并进行修复。)
抱歉,我无法提供更多帮助。
从Propel 文档中收集的关于连接表的信息。