首页 > 作文

Laravel实现批量更新多条数据

更新时间:2023-04-08 19:28:03 阅读: 评论:0

前言

近期在刷新生产环境数据库的时候,需要更新表中的字段,如果对每条数据结果都执行一次update语句,占用的数据库资源就会很多,而且速度慢。

因为项目是laravel框架,laravel有批量插入的方法,却没有批量更新的方法,没办法只能自己实现。

准备

mysql ca…when的用法

mysql 的 ca when 的语法有两种:

简单函数

ca [col_name] when [value1] then [result1]…el [default] end

ca [col_name] when [value1] then [result1]…el [default] end: 枚举这个字段所有可能的值

lect id,status '状态值', ca statuswhen 10 then '未开始'when 20 then '配送中'when 30 then '已完成'when 40 then '已取消'end '状态'from table

输出结果:

搜索函数

ca when [expr] then [result1]…el [default] end

ca when [expr] then [result1]…el [default] end:搜索函数可以写判断,并且搜索函数只会返回第一个符合条件的值,其他ca被忽略

lect id,lese_id '租户id', ca when lese_id <=1 then '自用系统'when lese_id >1 then刘小光出轨女粉丝 '租用系统'end '系统分类'from waybill_ba_info

ca…when实现数据库的批量更新

更新单列的值

update ba_info t city_id = ca id  when 1 then   when 2 then   when 3 then  endwhere 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 ba_info tcity_id = ca idwhen 1 then 100010when 2 then 100011when 3 then 100012end,city_name = ca idwhen 1 then ‘北京'when 2 then ‘上海'when 3 then ‘广州'endwhere id in (1,2,3)

不过这个有个缺点 : 要注意的问题是sql语句的长度,需要考虑程序运行环境所支持的字符串长度,当然这也可以更新mysql的设置来扩展。

laravel实现批量更新

在model方法中封装该批量更新的方法:

//批量更新 public function updatebatch($multipledata = []) {  try {   if (empty($multipledata)) {    log::info("批量更新数据为空"); 齐白石的代表作   return fal;   }   $tablename = $this->table; // 表名   $firstrow = current($multipledata);  $updatecolumn = array_keys($firstrow);  // 默认以id为条件更新,如果没有id则以第一个字段为条件  $referencecolumn = ist($firstrow['id']) ? 'id' : current($updatecolumn);  unt($updatecolumn[0]);  // 拼接sql语句  $updatesql = "update " . $tablename . " t ";  $ts = [];  $bindings = [];  foreach ($updatecolumn as $ucolumn) {   $tsql = "`" . $ucolumn . "` = ca ";   foreach ($multipledata as $data) {    $tsql .= "when `" . $referencecolumn . "` = ? then ? ";    $bindings[] = $data[$referencecolumn];    $bindings[] = $data[$ucolumn];   }   $tsql .= "el `" . $ucolumn . "` end ";   $ts[] = $tsql;  }  $updatesql .= implode(', ', $ts);  $wherein = collect($multipledata)->plu高中学习计划ck($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 fal; }}

在rvice层拼接需要更新的数据,并调用该函数:

 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 ba_info t `city_id` = ca when `id` = 1 then 100010 when `id` = 2 then 100011 el `city_id` end where `id` in (1,2)

因为每次只操作20条数据,所以这样拼接的字符串不会太长,符合mysql的字符串长度的要求,解决问题。

本文主要讲解了laravel实现批量更新多条数据的方法,更多关于laravel的会议室布置使用技巧请查看下面的相关链接

本文发布于:2023-04-08 19:28:02,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/4cf5da4a6da8c7a344cb79a09256bec8.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Laravel实现批量更新多条数据.doc

本文 PDF 下载地址:Laravel实现批量更新多条数据.pdf

标签:批量   语句   数据   函数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图