Criteria
アプリケーションに Propel PHP フレームワークの v1.3 を使用していますが、オブジェクトを使用して派生テーブルから選択する方法が見つかりません。私が欲しいSQLの一部は次のとおりです。
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 はこれよりも複雑ですが、それにはさらに結合が含まれているだけです。
を使用しようとしましたがCriteria::addAlias()
、残念ながら、テーブル定義を SQL エスケープしようとします。最終的に、その方法で SQL を記述しようとするのをあきらめ、ビュー (unisoned_table
この例で呼び出されます) を作成しました。
次に、このテーブルに結合を追加しようとしました。
$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);
// ...
悲しいことに、これによりビューが 2 回結合されます。1回は との内部結合として、qux
もう 1 回は との交差結合として結合されbaz
ます。baz
奇妙なことに、 SELECT 列を削除すると、クロス結合が消えます。
どうすればこれを行うことができるかについて誰か提案がありますか? Criteria
カスタム SQL は変更 (列の置き換え、追加条件の追加など) する必要があるか、doCount()
呼び出しで使用する必要があるため、そのままのカスタム SQL を使用することはできません。