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 相关文章推荐
PHP的FTP学习(三)
Oct 09 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
php实现可以设置中奖概率的抽奖程序代码分享
Jan 19 PHP
php curl 上传文件代码实例
Apr 27 PHP
10条php编程小技巧
Jul 07 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 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
PHP的ASP防火墙
2006/10/09 PHP
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
php中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
php 记录进行累加并显示总时长为秒的结果
2011/11/04 PHP
基于PHP实现通过照片获取ip地址
2016/04/26 PHP
php array_udiff_assoc 计算两个数组的差集实例
2016/11/12 PHP
php数据库操作model类(使用__call方法)
2016/11/16 PHP
php解决安全问题的方法实例
2019/09/19 PHP
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
jquery.validate使用详解
2016/06/02 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
了解重排与重绘
2019/05/29 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
python多重继承实例
2014/10/11 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
python通过socket查询whois的方法
2015/07/18 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
python dataframe NaN处理方式
2019/12/26 Python
Pytorch 图像变换函数集合小结
2021/02/01 Python
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
JPA的优势都有哪些
2013/07/04 面试题
室内设计自我鉴定
2013/10/15 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
新教师岗前培训方案
2014/06/05 职场文书
专科生就业求职信
2014/06/22 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
世界气象日活动总结
2015/02/27 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript