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)
是不是效率又提高了一大截呢~
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。