Laravel一次更新多条记录,批量更新的方法
在我们实际应用中,免不了这样的情况——例如我们同时录入多条信息,可能三条五条还好说,但量一旦变大,就会增加读写数据库的次数,会降低效率,那么,我们该如何实现,做到一次读写数据库,批量更新呢?
例如这种情况:
HTML代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="/enroll/complete_order_store" method="post">
{!!csrf_field()!!}
@foreach($seats as $s) //多个座位信息,每个都有他的ID
<br>
<br>
<br>
座位号:{{$s->id}}({{$s->rows."排".$s->cols."座"}})
<input type="hidden" name="id{{$s->id}}" value="{{$s->id}}">
<br>
姓名:<input type="text" name="name{{$s->id}}" id="" value="{{$s->name}}"> //为了区别不同ID提交的不同name,所以在name后面加上了ID
<br>
手机:<input type="text" name="mobile{{$s->id}}" id="" value="{{$s->mobile}}">
<br>
学校/单位:<input type="text" name="school{{$s->id}}" id="" value="{{$s->school}}">
<br>
电子邮箱:<input type="text" name="email{{$s->id}}" id="" value="{{$s->email}}">
<br>
是否需要发票: 是<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":""}}>
<br>
地址:<input type="text" name="address{{$s->id}}" id="" value="{{$s->address}}">
<br>
邮编:<input type="text" name="post_code{{$s->id}}" id="" value="{{$s->post_code}}">
@endforeach
<input type="hidden" name="ids" value="{{$ids}}"> //这里ids是把所有id拼接成带逗号的字符串,例如 1,2,3
<input type="submit" value="OK">
</form>
</body>
</html>
//test data
/*
$multipleData = array(
array(
"id" => "My id" ,
"name" => "My Name 2" ,
"date" => "My date 2"
),
array(
"id" => "Another id" ,
"name" => "Another Name 2" ,
"date" => "Another date 2"
)
)
*/ public function completeOrderStore(Request $request){
$ids = Input::get("ids"); //拿到逗号分隔的字符串,然后把他们变成数组
$arr = explode(",", $ids);
$multipleData = [];
foreach($arr as $a){ //组成例子那样的数组
$multipleData[] = ["id"=>$a,
"name"=>Input::get("name".$a),
"mobile"=>Input::get("mobile".$a),
"school"=>Input::get("school".$a),
"email"=>Input::get("email".$a),
"is_bill"=>Input::get("is_bill".$a),
"address"=>Input::get("address".$a),
"post_code"=>Input::get("post_code".$a)
];
}
$res = $this->updateBatch("seats",$multipleData);
return Redirect::to("/enroll/myorder");
}//同时更新多个记录,参数,表名,数组(别忘了在一开始use DB;)
public function updateBatch($tableName = "", $multipleData = array()){
if( $tableName && !empty($multipleData) ) {
// column or fields to update
$updateColumn = array_keys($multipleData[0]);
$referenceColumn = $updateColumn[0]; //e.g id
unset($updateColumn[0]);
$whereIn = "";
$q = "UPDATE ".$tableName." SET ";
foreach ( $updateColumn as $uColumn ) {
$q .= $uColumn." = CASE ";
foreach( $multipleData as $data ) {
$q .= "WHEN ".$referenceColumn." = ".$data[$referenceColumn]." THEN "".$data[$uColumn]."" ";
}
$q .= "ELSE ".$uColumn." END, ";
}
foreach( $multipleData as $data ) {
$whereIn .= """.$data[$referenceColumn]."", ";
}
$q = rtrim($q, ", ")." WHERE ".$referenceColumn." IN (". rtrim($whereIn, ", ").")";
// Update
return DB::update(DB::raw($q));
} else {
return false;
}
}
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: laravel excel循环导出
- 下一篇: Laravel Excel导出xls乱码
