我有以下两个表:

  table_a:
    id_table_a: { type: integer, primaryKey: true, autoIncrement: true, required: true }
    name:       { type: varchar(255) }
    id_table_b: { type: integer, foreignTable: table_b, foreignReference: id_table_b }

  table_b:
    id_table_b: { type: integer, primaryKey: true, autoIncrement: true, required: true }
    value_1:    { type: varchar(255) }
    value_2:    { type: integer }

我想使用 select 方法构建 SQL 查询以跳过水化,还使用连接表上的别名:
 TableAQuery::create()
            ->useTableBQuery('a')
                // some filters methods
            ->endUse()
            ->useTableBQuery('b')
                // some filters methods
            ->endUse()
            ->select(array('a.value_1', 'b.value_2'))
            ->find();

现在问题来了。 Propel 不断地将 ab 别名更改为 table_b 生成不正确的 SQL,如下所示:
SELECT table_b.value_1 AS "a.value_1", table_b.value_2 AS "b.value_2" FROM `table_a`
LEFT JOIN `table_b` `a` ON (table_a.id_table_b=a.id_table_b)
LEFT JOIN `table_b` `b` ON (table_a.id_table_b=b.id_table_b)

代替
SELECT a.value_1 AS value_1, b.value_2 AS value_2 FROM `table_a`
LEFT JOIN `table_b` `a` ON (table_a.id_table_b=a.id_table_b)
LEFT JOIN `table_b` `b` ON (table_a.id_table_b=b.id_table_b)

我该如何处理?我使用 Propel 1.6.9

更新

我还检查了推进 1.7.1,没有区别。

最佳答案

你能改成这样吗?

TableAQuery::create()
        ->useTableBQuery('a')
            // some filters methods
        ->endUse()
        ->useTableBQuery('b')
            // some filters methods
        ->endUse()
        //->select(array('a.value_1', 'b.value_2'))
        ->addAsColumn('a.value_1', 'a.value_1')
        ->addAsColumn('b.value_2', 'b.value_2')
        ->find();

警告:我不是 Propel 用户。我只是想知道自动生成的 useXXXQuery() 是否两次都在同一关系上设置表别名,或者类似的东西。

与上面的查询一样,将 select() 替换为两个 addAsColumn() 语句。这有点黑客,但我认为它达到了你想要的结果。

我只是花了一段时间阅读了 Propel 源代码,我得出的结论是,在您尝试时,Propel 1 不是为了在多次连接的同一个表上使用不同的别名而构建的。在 ModelCriteria.php 中,使用 $column->getFullyQualifiedName 可确保在连接表的选择中使用全名 (table.column),而不管别名如何。 (请参阅 https://github.com/propelorm/Propel/blob/7ddb0956b699343d33ce0c94043fa5970cc719c1/runtime/lib/query/ModelCriteria.php#L2082 。)我希望这确实是一个错误。

如果使用 addAsColumn() 方法而不是 select() ,Propel 将使用您的文字 SQL 表达式,无论它是别名和列还是其他任何东西。也就是说,我不确定这是它的预期用途。

关于php - Propel:从别名连接表中选择列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19524589/

10-13 03:54