[英]How can I select from a derived table in 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
的内部qux
,一次作为与baz
的交叉qux
。 奇怪的是,如果我删除baz
SELECT列,则交叉连接消失。
有人对我该如何做有什么建议吗? 我不能只使用裸自定义SQL,因为可能需要修改此Criteria
(替换列,添加额外条件等)或在doCount()
调用中使用。
事实证明,顺序在Criteria::addJoin()
很重要; 更改联接,使它们显示为:
$c->addJoin(QuuxPeer::FIELD, 'unioned_table.foo', Criteria::INNER_JOIN);
$c->addJoin('unioned_table.bar', BazPeer::BLAH, Criteria::INNER_JOIN);
解决了这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.