导航栏

文章

  • 首页
  • 查看历史

导航栏

  • 登陆
    • QQ登陆 微博登陆
  • 其他
    • 图标库
  • 夜间模式
  • 退出登录

【亲测】Laravel 批量更新数据 自用【亲测】


作者:科技小锅盖             时间:2021-9-03 10:38             站长QQ:1540217035

Laravel 批量添加删除都可以操作,唯独批量更新比较闹心,foreach循环的话比较耗费资源,这里分享个批量更新的原生的sql方法,随拿随用。

/***
*
批量更新操作
* @param string $table_name  表名字
* @param array $multiple_data 更新数据,第一个字段为条件
* @return false|int
*/
public function updateBatch($table_name, $multiple_data = [])
{
   
$chunk_result = array_chunk($multiple_data, 1000);
   
$return = false;
   foreach
($chunk_result as $key => $multiple_data) {
       
try {
           
$firstRow = current($multiple_data);
           
$updateColumn = array_keys($firstRow);
           
// 以第一个字段为条件
           
$referenceColumn = current($updateColumn);
           unset
($updateColumn[0]);
           
// 拼接sql语句
           
$updateSql = "UPDATE " . $table_name . " SET ";
           
$sets = [];
           
$bindings = [];
           foreach
($updateColumn as $uColumn) {
               
$setSql = "`" . $uColumn . "` = CASE ";
               foreach
($multiple_data as $data) {
                   
$setSql .= "WHEN `" . $referenceColumn . "` = ? THEN ? ";
                   
$bindings[] = $data[$referenceColumn];
                   
$bindings[] = $data[$uColumn];
               
}
               
$setSql .= "ELSE `" . $uColumn . "` END ";
               
$sets[] = $setSql;
           
}
           
$updateSql .= implode(', ', $sets);
           unset
($sets);
           
$whereIn = collect($multiple_data)->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;
       
}
       
unset($updateSql, $bindings);
       unset
($chunk_result[$key]);
   
}
   
return $return;
}

当然有些涉及到批量修改的,也可以简单粗暴直接全部相关数据删除重新添加,但是这样的简单粗暴只是适用于数据量较小的修改。


推荐

科技小锅盖Halo分站正式上线

2022-11-09 10:04:51

谷歌可能会效仿苹果为安卓系统提供有限的反广告网络追踪功能

2021-02-08 10:00:55

华为已经重启4G手机生产,目前正在积极备货

2020-12-02 09:33:41

【亲测】vue-element-admin v4.x 去除mock数据请求自己接口 【亲测】

2020-12-04 16:43:30

坚果手机没了!字节跳动暂停手机相关业务,坚果R2刚宣布将大降价

2021-01-18 15:58:29

【亲测】Navicat Premium 15 永久破解激活工具及安装教程【亲测】

2021-05-18 16:21:26

【亲测】Centos7 清理Linux /var/log/日志文件 【亲测】

2021-11-15 10:15:10

【亲测】composer私有库搭建过程 ,可不是网上烂大街的帖子【亲测】

2021-07-09 10:56:45

【亲测】科技小锅盖 整理 Eslint 规则说明【亲测】

2020-07-31 10:38:48

【亲测】Elasticsearch 配置集群的配置文件记录【亲测】

2021-12-13 18:14:08

陕ICP备2021003534号-1 科技小锅盖 保留所有权利 网站地图 站长QQ:1540217035
    友情链接:
  • 米醋儿
  • 笔墨