0

我有一个 EAV 结构的数据库,有这个表:

Entity (id, name)
Attribute (id, name)
AttributeValue(fk_id_entity, fk_id_attribute, value)

我想要做的是在 Propel 中翻译以下查询:

SELECT entity.name, avx.value, avy.value
FROM Entity entity
INNER JOIN AttributeValue avx ON (avx.fk_id_entity = entity.id 
AND avx.name = 'X')
INNER JOIN AttributeValue avy ON (avy.fk_id_entity = entity.id 
AND avy.name = 'Y')

知道我怎么能在 Popel 中做到这一点?谢谢!

LE:想法是每个实体都有两个属性 X 和 Y,我想显示所有实体的列表以及它们的 X 和 Y 属性。

4

2 回答 2

2

因此,这是复制您在 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') 

(问题是SELECTline 和INNER JOINon attributewhich usesattribute.name = 'X'而不是正确的ax.name = 'X'。)

因此,您可以使用手动查询运行正确的SQL,或者等待修复错误(我将尝试在 Guthub 上写一个问题并进行修复。)

抱歉,我无法提供更多帮助。

从Propel 文档中收集的关于连接表的信息。

于 2013-03-28T15:37:46.577 回答
0

它实际工作的是以下内容:

$result = Entity_EntityQuery::create()
->withColumn('alias1.value', 'xvalue')
->withColumn('alias2.value', 'yvalue')
->innerjoinValue('alias1')
->useValueQuery('alias1')
->filterbyFkAttribute('x attribute id')
->endUse()
->innerjoinValue('alias1')
->useValueQuery('alias1')
->filterbyFkAttribute('y attribute id')
->endUse()
...//conditions
->find()

感谢大家观看和回复!

于 2013-04-05T12:35:55.267 回答