Ditulis di hadapan
Semua orang yang biasa dengan laravel tahu bahawa laravel mempunyai Berbilang rekod dimasukkan dalam kelompok pada satu masa, tetapi berbilang rekod tidak dikemas kini secara bersyarat pada satu masa.
Adakah anda iri hati dengan update_batch thinkphp saveAll dan ci, tetapi mengapa laravel yang elegan itu tidak mempunyai kaedah kemas kini kelompok yang serupa?
Pakar meng-Google orang itu
dan mendapati seseorang telah menulis pada stackoverflow (https://stackoverflow.com/questions/26133977/laravel-bulk-update) Baiklah, tetapi ia tidak menghalang suntikan sql.
Artikel ini telah dilaraskan bersama dengan laravel's Eloquent untuk mencegah suntikan sql dengan berkesan.
<?php namespace App\Models; use DB; use Illuminate\Database\Eloquent\Model; /** * 學(xué)生表模型 */ class Students extends Model { protected $table = 'students'; //批量更新 public function updateBatch($multipleData = []) { try { if (empty($multipleData)) { throw new \Exception("數(shù)據(jù)不能為空"); } $tableName = DB::getTablePrefix() . $this->getTable();?//?表名 ????????????$firstRow??=?current($multipleData); ????????????$updateColumn?=?array_keys($firstRow); ????????????//?默認(rèn)以id為條件更新,如果沒(méi)有ID則以第一個(gè)字段為條件 ????????????$referenceColumn?=?isset($firstRow['id'])???'id'?:?current($updateColumn); ????????????unset($updateColumn[0]); ????????????//?拼接sql語(yǔ)句 ????????????$updateSql?=?"UPDATE?"?.?$tableName?.?"?SET?"; ????????????$sets??????=?[]; ????????????$bindings??=?[]; ????????????foreach?($updateColumn?as?$uColumn)?{ ????????????????$setSql?=?"`"?.?$uColumn?.?"`?=?CASE?"; ????????????????foreach?($multipleData?as?$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?.?")"; ????????????//?傳入預(yù)處理sql語(yǔ)句和對(duì)應(yīng)綁定數(shù)據(jù) ????????????return?DB::update($updateSql,?$bindings); ????????}?catch?(\Exception?$e)?{ ????????????return?false; ????????} ????} }
boleh dilaraskan mengikut keperluan anda sendiri Berikut adalah contoh penggunaan:
//?要批量更新的數(shù)組 $students?=?[ ????['id'?=>?1,?'name'?=>?'張三',?'email'?=>?'zhansan@qq.com'], ????['id'?=>?2,?'name'?=>?'李四',?'email'?=>?'lisi@qq.com'], ]; //?批量更新 app(Students::class)->updateBatch($students);
Pernyataan SQL yang dihasilkan adalah seperti berikut:
UPDATE?pre_students SET?NAME?=?CASE WHEN?id?=?1?THEN ????'張三' WHEN?id?=?2?THEN ????'李四' ELSE ????NAME END, ?email?=?CASE WHEN?id?=?1?THEN ????'zhansan@qq.com' WHEN?id?=?2?THEN ????'lisi@qq.com' ELSE ????email END WHERE ????id?IN?(1,?2)Adakah ia cekap? Ia telah banyak bertambah baik~
Cadangan berkaitan: