1

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 を使用することはできません。

4

1 に答える 1

1

では順序が重要であることがわかりましたCriteria::addJoin()。結合を変更して、次のように読み取ります。

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

問題を修正しました。

于 2009-07-01T16:12:48.797 に答える