laravel实现批量更新多条记录的方法示例
前言
相信熟悉laravel的童鞋都知道,laravel有批量一次性插入多条记录,却没有一次性按条件更新多条记录。
是否羡慕thinkphp的saveAll,是否羡慕ci的update_batch,但如此优雅的laravel怎么就没有类似的批量更新的方法呢?
高手在民间
Google了一下,发现stackoverflow(https://stackoverflow.com/questions/26133977/laravel-bulk-update)上已经有人写好了,但是并不能防止sql注入。
本篇文章,结合laravel的Eloquent做了调整,可有效防止sql注入。
示例代码
getTable();//表名
$firstRow=current($multipleData);
$updateColumn=array_keys($firstRow);
//默认以id为条件更新,如果没有ID则以第一个字段为条件
$referenceColumn=isset($firstRow['id'])?'id':current($updateColumn);
unset($updateColumn[0]);
//拼接sql语句
$updateSql="UPDATE".$tableName."SET";
$sets=[];
$bindings=[];
foreach($updateColumnas$uColumn){
$setSql="`".$uColumn."`=CASE";
foreach($multipleDataas$data){
$setSql.="WHEN`".$referenceColumn."`=?THEN?";
$bindings[]=$data[$referenceColumn];
$bindings[]=$data[$uColumn];
}
$setSql.="ELSE`".$uColumn."`END";
$sets[]=$setSql;
}
$updateSql.=implode(',',$sets);
$whereIn=collect($multipleData)->pluck($referenceColumn)->values()->all();
$bindings=array_merge($bindings,$whereIn);
$whereIn=rtrim(str_repeat('?,',count($whereIn)),',');
$updateSql=rtrim($updateSql,",")."WHERE`".$referenceColumn."`IN(".$whereIn.")";
//传入预处理sql语句和对应绑定数据
returnDB::update($updateSql,$bindings);
}catch(\Exception$e){
returnfalse;
}
}
}
可以根据自己的需求再做调整,下面是用法实例:
//要批量更新的数组 $students=[ ['id'=>1,'name'=>'张三','email'=>'zhansan@qq.com'], ['id'=>2,'name'=>'李四','email'=>'lisi@qq.com'], ]; //批量更新 app(Students::class)->updateBatch($students);
生成的SQL语句如下:
UPDATEpre_students SETNAME=CASE WHENid=1THEN '张三' WHENid=2THEN '李四' ELSE NAME END, email=CASE WHENid=1THEN 'zhansan@qq.com' WHENid=2THEN 'lisi@qq.com' ELSE email END WHERE idIN(1,2)
是不是效率又提高了一大截呢~
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。