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 JOIN
onです。)attribute
attribute.name = 'X'
ax.name = 'X'
したがって、手動クエリを使用して正しいSQL を実行するか、バグが修正されるのを待つことができます ( guthubに問題を書き込んで修正に取り組みます)。
申し訳ありませんが、これ以上お役に立てませんでした。
テーブルの結合に関する Propel ドキュメントから収集された情報。