2009-07-01 38 views
1

我对应用程序使用Propel PHP框架的v1.3,我找不到使用Criteria对象从派生表中选择的方法。我想要的SQL的一部分是:如何从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比这更复杂,但只包括进一步的连接。

我试过使用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,因为可能需要修改(更换列,添加额外条件等),或在doCount()调用中使用此Criteria

回答

1

事实证明,订单在Criteria::addJoin();改变连接,使他们阅读:

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

修复了这个问题。