//批量更新publicfunctionupdateBatch($multipleData=[]){try{if(empty($multipleData)){thrownew\Exception("数据不能为空");}$tableName=DB::getTablePrefix().$this->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;}}
我通常会尽量避免 循环里面 去做数据库操作,例如有批量插入的情况,我会处理完数据 一次性写入数据库。 希望能对您有所帮助。
尽量避免循环查库,如果可以,尽量批量插入/更新,数据量特别大,可以先chunk一下,在批量操作,如果在循环里面用到了一些数据,可以先查询出来(集合),然后在循环内使用集合方法,增加where条件筛选等等。。。。 laravel 集合方法很强大,非常多的实用方法
这样相当于只查询了一次数据库
批量插入,DB::insert(); 批量更新,updateBatch()