繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM