2009-07-01 10 views
1

Propel PHPフレームワークのv1.3をアプリケーション用に使用しています。Criteriaオブジェクトを使用して派生テーブルから選択する方法が見つかりません。Propelの派生テーブルからどのように選択できますか?

SELECT unioned_table.foo, quux.stuff, baz.more_stuff... 
FROM 
    quux 
    INNER JOIN 
    (SELECT foo, bar FROM table1 
    UNION 
    SELECT foo, bar FROM table2 
) AS unioned_table 
    ON quux.field = unioned_table.foo 
INNER JOIN baz 
    ON baz.blah = unioned_table.bar 
INNER JOIN ... 
WHERE conditions... 

実際のSQLがこれよりも複雑ですが、それはちょうど、さらに参加しています私がしたいSQLの一部があります。

残念ながら、テーブル定義をSQLエスケープしようとしましたが、Criteria::addAlias()を使用しようとしました。私は最終的にそのような方法でSQLを書くことをあきらめ、ビュー(この例ではunisoned_tableと呼ばれる)を作成しました。

Iは次の追加しようとし、このテーブルに参加:

$c->addSelectColumn('unioned_table.foo'); 
$c->addSelectColumn(QuuxPeer::STUFF); 
$c->addSelectColumn(BazPeer::MORE_STUFF); 
// ... 

$c->addJoin(QuuxPeer::FIELD, 'unioned_table.foo', Criteria::INNER_JOIN); 
$c->addJoin(BazPeer::BLAH, 'unioned_table.bar', Criteria::INNER_JOIN); 
// ... 

$c->add(QuuxPeer::STUFF, $someval); 
// ... 

残念ながら、これは二回が接合されるビューをもたらす - インナーquxと結合し、一度クロスとしてbazとの結合として一旦。奇妙なことに、baz SELECT列を削除すると、クロス結合が消えます。

私はこれをどのように行うことができますか?このCriteriaを修正する必要があるかもしれない(列の置き換え、余分な条件の追加など)、またはdoCount()呼び出しで使用される可能性があるため、裸のカスタムSQLは使用できません。

答えて

1

Criteria::addJoin()でその順序が重要であることが判明しました。結合を変更して読み込みます。

$c->addJoin(QuuxPeer::FIELD, 'unioned_table.foo', Criteria::INNER_JOIN); 
$c->addJoin('unioned_table.bar', BazPeer::BLAH, Criteria::INNER_JOIN); 

問題を修正しました。

関連する問題