laravel实现批量更新多条记录的方法示例


Posted in PHP onOctober 22, 2017

前言

相信熟悉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
 '李四'
ELSE
 NAME
END,
 email = CASE
WHEN id = 1 THEN
 'zhansan@qq.com'
WHEN id = 2 THEN
 'lisi@qq.com'
ELSE
 email
END
WHERE
 id IN (1, 2)

是不是效率又提高了一大截呢~

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
提取HTML标签
Oct 09 PHP
Eclipse中php插件安装及Xdebug配置的使用详解
Apr 25 PHP
PHP自定义大小验证码的方法详解
Jun 07 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
Jun 09 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
php类中的各种拦截器用法分析
Nov 03 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
wamp服务器访问php非常缓慢的解决过程
Jul 01 PHP
php版阿里云OSS图片上传类详解
Dec 01 PHP
PHP封装curl的调用接口及常用函数详解
May 31 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
Aug 30 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 PHP
利用PHP获取汉字首字母并且分组排序详解
Oct 22 #PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 #PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 #PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 #PHP
php+ajax实现仿百度查询下拉内容功能示例
Oct 20 #PHP
详解cookie验证的php应用的一种SSO解决办法
Oct 20 #PHP
thinkPHP5项目中实现QQ第三方登录功能
Oct 20 #PHP
You might like
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
Jquery replace 字符替换实现代码
2010/12/02 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
Angularjs 创建可复用组件实例代码
2016/10/09 Javascript
javascript 开发之百度地图使用到的js函数整理
2017/05/19 Javascript
vue操作下拉选择器获取选择的数据的id方法
2018/08/24 Javascript
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
python求斐波那契数列示例分享
2014/02/14 Python
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
Python基于numpy灵活定义神经网络结构的方法
2017/08/19 Python
TensorFlow实现模型评估
2018/09/07 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
Python解释器及PyCharm工具安装过程
2020/02/26 Python
Tensorflow中的dropout的使用方法
2020/03/13 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
Html5实现首页动态视频背景的示例代码
2019/09/25 HTML / CSS
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
黄金搭档广告词
2014/03/21 职场文书
美容院店长岗位职责
2014/04/08 职场文书
装修活动策划方案
2014/08/27 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
老干部工作汇报材料
2014/10/28 职场文书
水电施工员岗位职责
2015/04/11 职场文书
地心历险记观后感
2015/06/15 职场文书
给领导敬酒词
2015/08/12 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android