Laravel一次更新多条记录,批量更新的方法

5 篇文章 0 订阅

在我们实际应用中,免不了这样的情况——例如我们同时录入多条信息,可能三条五条还好说,但量一旦变大,就会增加读写数据库的次数,会降低效率,那么,我们该如何实现,做到一次读写数据库,批量更新呢?

例如这种情况:


HTML代码:

[html]  view plain  copy
 print ?
  1. <!doctype html>  
  2. <html lang="en">  
  3. <head>  
  4.     <meta charset="UTF-8">  
  5.     <title>Document</title>  
  6. </head>  
  7. <body>  
  8.     <form action="/enroll/complete_order_store" method='post'>  
  9.         {!!csrf_field()!!}  
  10.         @foreach($seats as $s) //多个座位信息,每个都有他的ID  
  11.         <br>  
  12.         <br>  
  13.         <br>  
  14.         座位号:{{$s->id}}({{$s->rows.'排'.$s->cols.'座'}})  
  15.         <input type="hidden" name="id{{$s->id}}" value='{{$s->id}}'>  
  16.         <br>  
  17.         姓名:<input type="text" name="name{{$s->id}}" id="" value='{{$s->name}}'> //为了区别不同ID提交的不同name,所以在name后面加上了ID  
  18.         <br>  
  19.         手机:<input type="text" name="mobile{{$s->id}}" id="" value='{{$s->mobile}}'>  
  20.         <br>  
  21.         学校/单位:<input type="text" name="school{{$s->id}}" id="" value='{{$s->school}}'>  
  22.         <br>  
  23.         电子邮箱:<input type="text" name="email{{$s->id}}" id="" value='{{$s->email}}'>  
  24.         <br>  
  25.         是否需要发票: 是<input type="radio" name="is_bill{{$s->id}}" value='1' {{$s->is_bill == 1?'checked':''}}><input type="radio" name="is_bill{{$s->id}}" value='0' {{$s->is_bill == 0?'checked':''}}>  
  26.         <br>  
  27.         地址:<input type="text" name="address{{$s->id}}" id="" value='{{$s->address}}'>  
  28.         <br>  
  29.         邮编:<input type="text" name="post_code{{$s->id}}" id="" value='{{$s->post_code}}'>  
  30.   
  31.   
  32.         @endforeach  
  33.         <input type="hidden" name="ids" value='{{$ids}}'> //这里ids是把所有id拼接成带逗号的字符串,例如 1,2,3  
  34.         <input type="submit" value="OK">  
  35.     </form>  
  36. </body>  
  37. </html>  


处理思路,利用SQL WHEN THEN的方法,这个方法是我看 http://stackoverflow.com/questions/26133977/laravel-bulk-update 里的,提交的数组应该是这种格式,主键放第一个

[php]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. //test data  
  2. /* 
  3. $multipleData = array( 
  4.    array( 
  5.       'id' => 'My id' , 
  6.       'name' => 'My Name 2' , 
  7.       'date' => 'My date 2' 
  8.    ), 
  9.    array( 
  10.       'id' => 'Another id' , 
  11.       'name' => 'Another Name 2' , 
  12.       'date' => 'Another date 2' 
  13.    ) 
  14. ) 
  15. */  


[php]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public function completeOrderStore(Request $request){  
  2.     $ids = Input::get('ids'); //拿到逗号分隔的字符串,然后把他们变成数组  
  3.     $arr = explode(','$ids);  
  4.     $multipleData = [];   
  5.     foreach($arr as $a){ //组成例子那样的数组  
  6.         $multipleData[] = ['id'=>$a,   
  7.                            'name'=>Input::get('name'.$a),  
  8.                            'mobile'=>Input::get('mobile'.$a),  
  9.                            'school'=>Input::get('school'.$a),  
  10.                            'email'=>Input::get('email'.$a),  
  11.                            'is_bill'=>Input::get('is_bill'.$a),  
  12.                            'address'=>Input::get('address'.$a),  
  13.                            'post_code'=>Input::get('post_code'.$a)  
  14.                            ];  
  15.          
  16.     }  
  17.     $res = $this->updateBatch('seats',$multipleData);  
  18.     return Redirect::to('/enroll/myorder');  
  19. }  

[php]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. //同时更新多个记录,参数,表名,数组(别忘了在一开始use DB;)  
  2.     public function updateBatch($tableName = ""$multipleData = array()){  
  3.   
  4.         if$tableName && !empty($multipleData) ) {  
  5.   
  6.             // column or fields to update  
  7.             $updateColumn = array_keys($multipleData[0]);  
  8.             $referenceColumn = $updateColumn[0]; //e.g id  
  9.             unset($updateColumn[0]);  
  10.             $whereIn = "";  
  11.   
  12.             $q = "UPDATE ".$tableName." SET ";   
  13.             foreach ( $updateColumn as $uColumn ) {  
  14.                 $q .=  $uColumn." = CASE ";  
  15.   
  16.                 foreach$multipleData as $data ) {  
  17.                     $q .= "WHEN ".$referenceColumn." = ".$data[$referenceColumn]." THEN '".$data[$uColumn]."' ";  
  18.                 }  
  19.                 $q .= "ELSE ".$uColumn." END, ";  
  20.             }  
  21.             foreach$multipleData as $data ) {  
  22.                 $whereIn .= "'".$data[$referenceColumn]."', ";  
  23.             }  
  24.             $q = rtrim($q", ")." WHERE ".$referenceColumn." IN (".  rtrim($whereIn', ').")";  
  25.   
  26.             // Update    
  27.             return DB::update(DB::raw($q));  
  28.   
  29.         } else {  
  30.             return false;  
  31.         }  
  32.   
  33.     } 

大功告成,速度是不是提升了一大截~
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值