php – Propel:从别名连接表中选择列
作者:互联网
我有以下两个表:
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不断改变a和b别名到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
UPDATE
我还检查了推进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表达式,无论它是别名和列还是其他任何东西.那就是说,我不确定它的用途是什么.
标签:propel,php,sql,mysql,orm 来源: https://codeday.me/bug/20190728/1565192.html