熟悉laravel的童鞋都知道,laravel是一次性批量插入多条记录,但不会根据条件一次性更新多条记录。羡慕thinkphp的saveAll,羡慕ci的update_batch,但是这么优雅的laravel为什么没有类似的批量更新方式呢?高手在民间google了一下,发现stackoverflow上已经有人写过了(https://stackoverflow.com/que...),但是不能防止sql注入。本文结合laravel的Eloquent调整,可以有效防止sql注入。getTable();//表名$firstRow=current($multipleData);$updateColumn=array_keys($firstRow);//默认以id为条件更新,如果没有id,以第一个字段为条件$referenceColumn=isset($firstRow['id'])?'id':当前($updateColumn);取消设置($updateColumn[0]);//拼接sql语句$updateSql="UPDATE".$表名。“放”;$套=[];$绑定=[];foreach($updateColumnas$uColumn){$setSql="`".$u列。“`=大小写”;foreach($multipleDataas$data){$setSql.="WHEN`".$referenceColumn。“`=?那么?”;$bindings[]=$data[$referenceColumn];$bindings[]=$data[$uColumn];}$setSql.="ELSE`".$u列。"`结束";$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,",")。“哪里`”。$referenceColumn。"`IN(".$whereIn.")";//传入预处理后的sql语句和对应的绑定数据returnDB::update($updateSql,$bindings);}catch(\Exception$e){返回假;}}}可以根据自己的需要进行调整,下面是一个使用示例://批量更新的数组$students=[['id'=>1,'name'=>'张三','邮箱'=>'zhansan@qq.com'],['id'=>2,'name'=>'Lisi','email'=>'lisi@qq.com'],];//批量更新app(Students::class)->updateBatch($学生);生成的SQL语句如下:UPDATEpre_studentsSETNAME=CASEWHENid=1THEN'张三'WHENid=2THEN'李四'ELSENAMEEND,email=CASEWHENid=1THEN'zhansan@qq.com'WHENid=2THEN'lisi@qq.com'ELSEemailENDWHEREidIN(1,2)效率是不是提高了不少~原文http://www.tech1024.cn/origin...
