脚本宝典收集整理的这篇文章主要介绍了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,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表达式,无论它是别名和列还是其他任何东西.那就是说,我不确定它的用途是什么.
以上是脚本宝典为你收集整理的php – Propel:从别名连接表中选择列全部内容,希望文章能够帮你解决php – Propel:从别名连接表中选择列所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。