laravel怎样实现批量更新数据?
Admin 2021-05-07 群英技术资讯 1815 次浏览
laravel怎样实现批量更新数据?我们知道Laravel框架中有批量插入数据的方法,但是没有批量更新的方法,如果要每条数据都执行一次,那么不仅速度慢而且会占用更多的资源。对此,这篇文章就给大家分享一下laravel实现批量更新多条数据的方法。
mysql case…when的用法
MySQL 的 case when 的语法有两种:
简单函数
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END: 枚举这个字段所有可能的值
select id,status '状态值', case status when 10 then '未开始' when 20 then '配送中' when 30 then '已完成' when 40 then '已取消' End '状态' from table
输出结果:

搜索函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END
CASE WHEN [expr] THEN [result1]…ELSE [default] END:搜索函数可以写判断,并且搜索函数只会返回第一个符合条件的值,其他case被忽略
select id,lessee_id '租户ID', case when lessee_id <=1 then '自用系统' when lessee_id >1 then '租用系统' End '系统分类' from waybill_base_info

case…when实现数据库的批量更新
更新单列的值
UPDATE base_info SET city_id = CASE id WHEN 1 THEN WHEN 2 THEN WHEN 3 THEN END WHERE id IN (1,2,3)
这句sql的意思是,更新city_id 字段:
如果id=1 则city_id 的值为100010,
如果id=2 则 city_id 的值为100011,
如果id=3 则 city_id 的值为100012。
即是将条件语句写在了一起。这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。
UPDATE base_info SET city_id = CASE id WHEN 1 THEN 100010 WHEN 2 THEN 100011 WHEN 3 THEN 100012 END, city_name = CASE id WHEN 1 THEN ‘北京' WHEN 2 THEN ‘上海' WHEN 3 THEN ‘广州' END WHERE id IN (1,2,3)
不过这个有个缺点 : 要注意的问题是SQL语句的长度,需要考虑程序运行环境所支持的字符串长度,当然这也可以更新mysql的设置来扩展。
在model方法中封装该批量更新的方法:
//批量更新
public function updateBatch($multipleData = [])
{
try {
if (empty($multipleData)) {
Log::info("批量更新数据为空");
return false;
}
$tableName = $this->table; // 表名
$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 . ")";
Log::info($updateSql);
// 传入预处理sql语句和对应绑定数据
return DB::update($updateSql, $bindings);
} catch (\Exception $e) {
return false;
}
}
在service层拼接需要更新的数据,并调用该函数:
foreach ($taskInfo as $info) {
$cityId = $info['requirement']['city_ids'];
//此处省略n行代码
$cityInfo = ['id' => $dataId[$info['id']]['id'], 'city_id' => $cityId];
if ($cityInfo) {
$cityInfos[] = $cityInfo;
}
}
$res = $this->waybillDriverInfoModel->updateBatch($cityInfos);
}
拼接的批量更新的数组格式为:
$students = [
[‘id' => 1, ‘city_id' => ‘100010'],
[‘id' => 2, ‘city_id' => ‘100011'],
];
生成的SQL语句如下:
UPDATE base_info SET `city_id` = CASE WHEN `id` = 1 THEN 100010 WHEN `id` = 2 THEN 100011 ELSE `city_id` END WHERE `id` IN (1,2)
因为每次只操作20条数据,所以这样拼接的字符串不会太长,符合mysql的字符串长度的要求,解决问题。
关于laravel批量更新数据的介绍就到这,上述方法是小编觉得比较实用的,因此分享给大家,希望对大家学习有帮助,更多laravel框架相关内容大家可以继续关注其他文章。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在PHP7之后,PHP中加入了匿名类的特性。匿名类和匿名方法让PHP成为了更现代化的语言,也让我们的代码开发工作越来越方便。下面本篇文章就来简单带大家了解一下PHP7 匿名类的用法,希望对大家有所帮助!
PHP中CI框架的运行模式:1、创建了控制器,abc是视图的文件.例如abc.php;2、视图代码,其实这个就等于GET方法.POST方法,基本内容上比较简单。
php mysql中文乱码的解决办法:1、网页文件head设置编码;2、将PHP页面在保存的时候使用utf-8编码保存;3、在MYSQL中新建数据库的时候数据库选择UTF-8编码。
php PSR-4的意思:1、PSR-4规范了指定文件路径从而自动加载类,同时规范了自动加载文件的位置。2、在PSR-4的键下,可以定义命名空间和路径的映射关系。
PHP自定义加密函数有哪些?在做项目的时候,我们可能会需要使用到加密函数,接下来小编就给大家分享一些PHP自定义加密函数,都是比较实用的,希望大家阅读完这篇文章能有收获,感兴趣的朋友就继续往下看吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008