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 相关文章推荐
dedecms中常见问题修改方法总结
Mar 21 PHP
有关 PHP 和 MySQL 时区的一点总结
Mar 26 PHP
php 禁止页面缓存输出
Jan 07 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
Nov 02 PHP
将php数组输出html表格的方法
Feb 24 PHP
PHP实现对站点内容外部链接的过滤方法
Sep 10 PHP
PHP获取当前完整URL地址的函数
Dec 21 PHP
PHP版微信公众平台红包API
Apr 02 PHP
PHP身份证校验码计算方法
Aug 10 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
Nov 06 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 PHP
Laravel相关的一些故障解决
Aug 19 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+DBM的同学录程序(2)
2006/10/09 PHP
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
laravel orm 关联条件查询代码
2019/10/21 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
Element-ui upload上传文件限制的解决方法
2021/01/22 Javascript
python中的一些类型转换函数小结
2013/02/10 Python
使用python 获取进程pid号的方法
2014/03/10 Python
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
Python字符串详细介绍
2015/05/09 Python
Python脚本实现虾米网签到功能
2016/04/12 Python
Python中的id()函数指的什么
2017/10/17 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
sklearn+python:线性回归案例
2020/02/24 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
大学生创业感言
2014/01/25 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
财务科长个人对照检查材料
2014/09/18 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
Python实现双向链表
2022/05/25 Python