如何从Propel中的派生表中进行选择?

时间:2009-07-01 15:43:43

标签: php mysql propel

我正在使用Propel PHP框架的v1.3作为应用程序,我找不到使用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);
// ...

可悲的是,这会导致视图加入两次 - 一次作为qux的内部联接,一次作为baz的交叉联接。奇怪的是,如果我删除了baz SELECT列,那么交叉连接就会消失。

有没有人对我如何做到这一点有任何建议?我不能只使用裸自定义SQL,因为可能需要修改Criteria(替换列,添加额外条件等)或在doCount()调用中使用。

1 个答案:

答案 0 :(得分:1)

事实证明,在Criteria::addJoin()中,顺序很重要;更改连接,以便他们阅读:

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

解决了这个问题。