我正在为应用程序使用 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()
调用中使用。