写在前面

熟悉laravel的童鞋都知道,laravel有批量一次性插入多条记录,却没有一次性按条件更新多条记录。

是否羡慕thinkphp的saveAll,是否羡慕ci的update_batch,但如此优雅的laravel怎么就没有类似的批量更新的方法呢?

高手在民间

Google了一下,发现stackoverflow( https://stackoverflow.com/questions/26133977/laravel-bulk-update )上已经有人写好了,但是并不能防止sql注入。

本篇文章,结合laravel的Eloquent做了调整,可有效防止sql注入。

//写在模型里<?php
namespace App\Models;use DB;
use Illuminate\Database\Eloquent\Model;/*** 学生表模型*/
class Students extends Model
{protected $table = 'students';//批量更新public function updateBatch($multipleData = []){try {if (empty($multipleData)) {throw new \Exception("数据不能为空");}$tableName = DB::getTablePrefix() . $this->getTable(); // 表名$firstRow  = current($multipleData);$updateColumn = array_keys($firstRow);// 默认以id为条件更新,如果没有ID则以第一个字段为条件$referenceColumn = isset($firstRow['id']) ? 'id' : current($updateColumn);unset($updateColumn[0]);// 拼接sql语句$updateSql = "UPDATE " . $tableName . " SET ";$sets      = [];$bindings  = [];foreach ($updateColumn as $uColumn) {$setSql = "`" . $uColumn . "` = CASE ";foreach ($multipleData as $data) {$setSql .= "WHEN `" . $referenceColumn . "` = ? THEN ? ";$bindings[] = $data[$referenceColumn];$bindings[] = $data[$uColumn];}$setSql .= "ELSE `" . $uColumn . "` END ";$sets[] = $setSql;}$updateSql .= implode(', ', $sets);$whereIn   = collect($multipleData)->pluck($referenceColumn)->values()->all();$bindings  = array_merge($bindings, $whereIn);$whereIn   = rtrim(str_repeat('?,', count($whereIn)), ',');$updateSql = rtrim($updateSql, ", ") . " WHERE `" . $referenceColumn . "` IN (" . $whereIn . ")";// 传入预处理sql语句和对应绑定数据return DB::update($updateSql, $bindings);} catch (\Exception $e) {return false;}}
}

可以根据自己的需求再做调整,下面是用法实例:

// 要批量更新的数组
$students = [['id' => 1, 'name' => '张三', 'email' => 'zhansan@qq.com'],['id' => 2, 'name' => '李四', 'email' => 'lisi@qq.com'],
];// 批量更新
app(Students::class)->updateBatch($students);

生成的SQL语句如下:

UPDATE pre_students
SET NAME = CASE
WHEN id = 1 THEN'张三'
WHEN id = 2 THEN'李四'
ELSENAME
END,email = CASE
WHEN id = 1 THEN'zhansan@qq.com'
WHEN id = 2 THEN'lisi@qq.com'
ELSEemail
END
WHEREid IN (1, 2)

以上是转载自https://www.tech1024.com/collect/3/2950.html

本人使用体会,若数据很多,SQL语句太长了也影响速度,需要把大数组拆块执行,速度会再提高三五倍!

            $chunk_datas = array_chunk($sdutents, 200, true);foreach ($chunk_datas as $chunk_data) {app(RunScore::class)->updateBatch($chunk_data);}

laravel批量更新多条记录相关推荐

  1. MySql数据库Update批量更新与批量更新多条记录的不同值实现方法

    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...

  2. mysql更新多条数据6_mysql语句:批量更新多条记录的不同值

    mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 如果更新同一字段为同一个值,mysql也很简单,修改下where即可: 这里注意 'other_values' 是一个逗号(,)分隔的字 ...

  3. mysql 批量更新数据 备份_mysql 批量更新与批量更新多条记录的不同值实现方法...

    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...

  4. 批量更新多条记录的不同值

    mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 1 UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_va ...

  5. mysql批量条件字段_mysql批量更新多条记录的同一个字段为不同值的方法

    首先mysql更新数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 也可以这 ...

  6. Laravel批量更新多条数据

    前言 近期在刷新生产环境数据库的时候,需要更新表中的字段,如果对每条数据结果都执行一次update语句,占用的数据库资源就会很多,而且速度慢,显得也不高大上. 因为项目是Laravel框架,Larav ...

  7. tp5 批量更新多条记录_Thinkphp怎么批量更新数据

    展开全部 ||thinkphp批量更新数据可以参考如下三种方法: 方法一: //批量修改 data二维数组 field关键字段62616964757a686964616fe59b9ee7ad94313 ...

  8. 5 批量更新多条记录_批量更新现有记录的默认表格方法

    根据小伙伴提示,我们可以使用CSV导入的方式,更新现有记录的默认表格. l 首先,我们要准备一个CSV文件,文件里只需要"记录的内部标识"信息即可. l 然后在CSV导入的时候,在 ...

  9. tp5 批量更新多条记录_TP5数据库操作——更新

    已知表:sdb_news (id,title,content,add_time). id 自增ID,title 新闻标题,content 新闻内容,add_time 添加时间 默认 News 模型已经 ...

最新文章

  1. Loadrunner常见的乱码问题
  2. python 字典等习题
  3. require demo 记录备份
  4. python php区别-PHP,Python,Java写出来的WEB程序有什么区别?
  5. 对高并发流量控制的一点思考
  6. 【chrome】插件开发-教程00(如何开发插件)
  7. [译]Chipmunk教程 - 5 跟踪球体的运动
  8. 天轰穿视频非知识点总结
  9. SAP 和 ERP 区别
  10. python代码提取图片文字
  11. 安卓 11 文件储存
  12. x射线计算机断层摄影设备参数,GB 17589—2011 X射线计算机断层摄影装置质量保证检测规范.pdf...
  13. ES (ElasticSearch) 简易解读(一)为什么用它
  14. SpringBoot实现分布式session
  15. ora-01172 ora-01151的处理
  16. 1. 神经网络面试题总结
  17. 系统安全及应用(操作)
  18. 工业用微型计算机08,自考《工业用微型计算机》02241 2008年真题 _ 重庆自考网
  19. 如何配置SonicWALL DNS代理
  20. Silk Zip文件分割器

热门文章

  1. 第十三章、C#操作XML文档(XmlDocument、XmlNode、XmlAttribute、SelectSingleNode、SelectNodes、XmlNodeList)...
  2. 微信灰度上线“分付” 支付宝的优势地位会被撼动吗?
  3. lol什么服务器出无限活力,LOL2017无限火力模式归来 测试服2月更新汇总
  4. 【AI简报20220225期】这枚仿人脑神经芯片跑AI模型超省电、OPPO Find X5系列发布
  5. c语言课程设计简易年月历计算,c语言课程设计《打印月历》.docx
  6. windows netsh设置代理服务器/端口转发
  7. jBPM用户指南 第九章 流程建模(转载)
  8. java自动换行方法_自动换行的实现方法zz
  9. hdmi linux 分辨率设置方法,话说你们的双屏显示器是怎样设置的 尤其是外接显示器分辨率设置...
  10. 宽高未知且居中,内容居左