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

どうすればポペルでこれを行うことができますか? ありがとうございました!

LE: 各エンティティには X と Y の 2 つの属性があり、すべてのエンティティのリストを X と Y の属性とともに表示したいと考えています。

4

2 に答える 2

2

SQL にあるものを複製する 1 つの方法を次に示しますが、私のコメントで述べたように、より効率的な方法があるかもしれません。上記のコメントの質問に対する回答を提供していただければ、この回答を改善できるかどうかを確認します。

まず、スキーマに相互参照テーブルが必要です。あなたがそうしていて、それが と呼ばれていると仮定しますAttributeValue。次に、結合を にEntityQuery追加し、条件を追加します。

残念ながら、以下のコードが適切な SQL を生成するのを妨げるバグが Propel にあるようです。

$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行とINNER JOINonです。)attributeattribute.name = 'X'ax.name = 'X'

したがって、手動クエリを使用して正しいSQL を実行するか、バグが修正されるのを待つことができます ( guthubに問題を書き込んで修正に取り組みます)。

申し訳ありませんが、これ以上お役に立てませんでした。

テーブルの結合に関する Propel ドキュメントから収集された情報。

于 2013-03-28T15:37:46.577 に答える