Yii 2.0 有批量更新多个字段的方法么? [ 2.0 版本 ]
批量插入有 batchInsert
方法,那么批量更新为什么没有 batchUpdate
方法呢?
遇到需要批量更新多字段的情况,大佬们都是怎么做的,求指导
最佳答案
其他 6 个回答
-
你说的批量更新是什么?
比如同时更新id=3,4,5的记录,将状态改为禁用,这是一种批量更新,可以用一条sql更新;
比如同时更新id=3,4,5的记录,要求3的状态为禁用,4,5的状态为启用,这种需要肯定不能用一条sql更新;共 1 条回复 -
可以用 case when :
update table set value1 = case id when 1 then value11 when 2 then value12 when 3 then value13 when 4 then value14 end, value2 = case id when 1 then value21 when 2 then value22 when 3 then value23 when 4 then value24 end where id in (1,2,3,4)
共 1 条回复 -
看到很多人对于 类似批量更新 提出的问题,另外据个人所知框架是没有提供什么优雅便捷方法的 (也欢迎大牛补充)。
这边先说下拼接 SQL 的样例:public function logicFun() { $tbName = 'tb_test'; $db = \Yii::$app->getDb(); $sqls = []; $sqls[] = (new \yii\db\Query())->createCommand($db) ->update($tbName,['lock'=>'yes'],['id'=>3]) ->getRawSql(); $sqls[] = (new \yii\db\Query())->createCommand($db) ->update($tbName,['lock'=>'no'],['id'=>[4,5]]) ->getRawSql(); $sql = implode(";\n", $sqls) . ';'; $query = $db->createCommand($sql); // var_dump($query->getRawSql()); //output: // UPDATE `tb_test` SET `lock`='yes' WHERE `id`=3; // UPDATE `tb_test` SET `lock`='no' WHERE `id` IN (4, 5); return $query->execute(); }
看一下上述代码,或许大家会觉得,“我要找的是优雅的解决方法,这么麻烦的话,我还用得着这样写?!” 还不如直接更新呢,如下:
ModelClass::updateAll(['lock'=>'yes'],['id'=>3]); ModelClass::updateAll(['lock'=>'no'],['id'=>[4,5]]);
说实话 ,“从(拼接)SQL中寻找优雅的解决方案” 个人是不太能理解的,因为更新跟批量插入本就是不同的场景。 或者说批量插入,也是提前准备好的数据,而不是在sql中决定具体插入的字段值。
自认为把数据处理逻辑写到sql中会让代码逻辑更加晦涩,后期维护难度更高。
所以,“非得一次拼接出 批量更新的语句” 或者 “非常优雅的解决一些高复杂的问题”,个人觉得可以追求 但不必苛求。
个人观点,欢迎补充,不喜勿喷。
codetu 北京
注册时间:2013-11-17
最后登录:2019-08-30
在线时长:1小时43分
最后登录:2019-08-30
在线时长:1小时43分
- 粉丝0
- 金钱15
- 威望0
- 积分25