如何使用 Yii 框架命令 DAO 对象进行联合所有命令
Posted
技术标签:
【中文标题】如何使用 Yii 框架命令 DAO 对象进行联合所有命令【英文标题】:How to make union all command using Yii framework command DAO object 【发布时间】:2014-11-27 15:04:48 【问题描述】:我正在尝试将几个表数据合并到一个查询中。我正在使用 Yii 框架(v1.15)。我已经这样做了,而且效果很好:
$command = Yii::app()->db->createCommand();
$command->select('something')->from('somewhere');
$command->union($sql);
这会产生这样的结果:
从某个联合中选择一些东西(选择 ....)
但 union 合并了重复的行值。我需要使用UNION ALL
合并所有数据,但在
documentation.
也许你们中的一些人如何使用 yii 数据库对象来做到这一点? 谢谢
【问题讨论】:
【参考方案1】:在 Yii 1.x.x
的查询构建器中,不支持 UNION ALL
。您可以将其更改为:
Yii::app()->db->createCommand("SELECT something FROM somewhere UNION ALL($sql)");
另一种方法是在CDbCommand
命令中覆盖union()
和buildQuery()
方法,或者通过继承CDbCommand
创建unionAll()
方法。
另一种脏方式是:
$sql=Yii::app()->db->createCommand()->select('something')->from('somewhere')->union("SELECT something FROM somewhere")->getText();
等于:
SELECT `something` FROM `somewhere` UNION ( SELECT something FROM somewhere)
然后:
$sql= str_replace('UNION', 'UNION ALL', $sql);
或者使用正则表达式:
$command->text = preg_replace('/\sUNION\s/', ' UNION ALL ', $command->text);
等于:
SELECT `something` FROM `somewhere` UNION ALL ( SELECT something FROM somewhere)
然后,将其传递给createCommand()
方法。
【讨论】:
好吧,脏的方式会产生一些意想不到的结果,但它可能会节省一些时间,我想我会使用脏的方式,但使用preg_replace
而不是str_replace
并搜索整个单词,希望降低替换错误单词的可能性 :) 谢谢您的澄清
在我的情况下,工会根本不起作用。当我执行$cmd1->union($cmd2->getText())
时,$cmd2 中的参数有问题:Invalid parameter number: number of bound variables does not match number of tokens
以上是关于如何使用 Yii 框架命令 DAO 对象进行联合所有命令的主要内容,如果未能解决你的问题,请参考以下文章
YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因