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

来源:互联网 发布:怎么查淘宝等级 编辑:程序博客网 时间:2024/05/16 13:54

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

例如这种情况:


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?
  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?
  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?
  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.     }  


大功告成,速度是不是提升了一大截~
阅读全文
0 0
原创粉丝点击