如何使用 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框架如何访问api

Yii如何使用数据库

yii2 框架的 AR 和 DAO 增删改查

YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因

如何将 DAO 查询转换为 Yii2 ActiveRecord。如何从连接表中选择和使用特定列

如何使用 DAO 检测 Yii 中事务中的最后一个插入 ID?