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; /** * 学生表模型 */ class Students extends Model { protected $table = 'students'; //批量更新 public function updateBatch($multipleData = []) { try { if (empty($multipleData)) { throw new \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 ($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 . ")"; // 传入预处理sql语句和对应绑定数据 return DB::update($updateSql, $bindings); } catch (\Exception $e) { return false; } } }
boleh dilaraskan mengikut keperluan anda sendiri Berikut adalah contoh penggunaan:
// 要批量更新的数组 $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: