2009-07-01 41 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); 

修復了這個問題。