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 相关文章推荐
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
PHP会话处理的10个函数
Aug 11 PHP
php+ajax注册实时验证功能
Jul 20 PHP
php根据用户名和手机号查询是否存在手机号码
Feb 16 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
Yii2中简单的场景使用介绍
Jun 02 PHP
PHP基于DOMDocument解析和生成xml的方法分析
Jul 17 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
Aug 10 PHP
Laravel框架实现的批量删除功能示例
Jan 16 PHP
基于PHP+mysql实现新闻发布系统的开发
Aug 06 PHP
PHP 时间处理类Carbon
May 20 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 adodb操作mysql数据库
2009/03/19 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
PHP 第二节 数据类型之字符串类型
2012/04/28 PHP
PHP检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
javascript add event remove event
2008/04/07 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
2015/04/16 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
js前端实现图片懒加载(lazyload)的两种方式
2017/04/24 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
JS控制只能输入数字并且最多允许小数点两位
2019/11/24 Javascript
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
django中使用POST方法获取POST数据
2019/08/20 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
办公室副主任岗位职责
2013/11/25 职场文书
大二学年个人总结
2015/03/03 职场文书
酒店总经理岗位职责
2015/04/01 职场文书
使用javascript解析二维码的三种方式
2021/11/11 Javascript
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers