1


0

Propelの派生テーブルからどのように選択できますか?

私はアプリケーションにv1.3のPropel PHPフレームワークを使用していますが、 `+ Criteria +`オブジェクトを使用して派生テーブルから選択する方法を見つけることができません。 私が欲しい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);
// ...

残念なことに、ビューは_twice_に結合されます-1回は + qux +`との内部結合として、1回は `+ baz +`との相互結合として。 奇妙なことに、 `+ baz + SELECTカラムを削除すると、クロス結合が消えます。

私はこれを行うことができる方法について誰かが何か提案がありますか? この `+ Criteria `の変更(列の置換、追加の条件の追加など)が必要な場合や、 ` doCount()+`呼び出しで使用される場合があるため、裸のカスタムSQLを使用することはできません。

1 Answer


1


`+ Criteria

addJoin()+`;では順序が重要であることがわかります。彼らが読むように結合を変更する:

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

問題を修正しました。