代码之家  ›  专栏  ›  技术社区  ›  DMI

如何从“推进”中的派生表中进行选择?

  •  1
  • DMI  · 技术社区  · 15 年前

    我正在为一个应用程序使用推进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 . 奇怪的是,如果我移除 选择“列”,则交叉连接将消失。

    有人对我如何做到这一点有什么建议吗?我不能只使用简单的定制SQL,因为 标准 可能需要修改(替换列、添加额外条件等)或用于 doCount() 呼叫

    1 回复  |  直到 15 年前
        1
  •  1
  •   DMI    15 年前

    事实证明,秩序在我们的生活中很重要 Criteria::addJoin() ; 更改联接以使其为:

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

    修正了这个问题。