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 相关文章推荐
使用 MySQL 开始 PHP 会话
Dec 21 PHP
PHP 文件上传进度条的两种实现方法的代码
Nov 25 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
从php核心代码分析require和include的区别
Jan 02 PHP
PHP 命令行参数详解及应用
May 18 PHP
神盾加密解密教程(二)PHP 神盾解密
Jun 08 PHP
PHP实现递归无限级分类
Oct 22 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
Jan 19 PHP
超强多功能php绿色集成环境详解
Jan 25 PHP
PHP实现上传多文件示例代码
Feb 20 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 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写的AES加密解密类分享
2014/06/20 PHP
ThinkPHP 404页面的设置方法
2015/01/14 PHP
使用jquery读取html5 localstorage的值的方法
2013/01/04 Javascript
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
jQuery插件ajaxFileUpload使用实例解析
2016/10/19 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
详解vue 模版组件的三种用法
2017/07/21 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
JavaScript进制转换实现方法解析
2020/01/18 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
详解vue路由
2020/08/05 Javascript
Python socket实现的简单通信功能示例
2018/08/21 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
护理学毕业生求职信
2013/11/14 职场文书
自荐信怎么写呢?
2013/12/09 职场文书
八一演出活动方案
2014/02/03 职场文书
《赶海》教学反思
2014/04/20 职场文书
公司联欢会策划方案
2014/05/19 职场文书
小学校本培训方案
2014/06/06 职场文书
机电一体化专业求职信
2014/07/22 职场文书
新颖的化妆品活动方案
2014/08/21 职场文书
质量整改报告范文
2014/11/08 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
关于开学的感想
2015/08/10 职场文书
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android