Vorwort
Ich glaube, dass Kinder, die mit Laravel vertraut sind, wissen, dass Laravel mehrere Datensätze gleichzeitig in Stapeln einfügen kann, aber nicht mehrere Datensätze aktualisiert Aufzeichnungen bedingt auf einmal.
Sind Sie neidisch auf saveAll von thinkphp und update_batch von ci, aber warum verfügt ein so elegantes Laravel nicht über eine ähnliche Batch-Update-Methode?
Experten haben die Leute gegoogelt
und herausgefunden, dass bereits jemand über Stackoverflow geschrieben hat (https://stackoverflow.com/questions/26133977/laravel-bulk-update) Okay, aber es verhindert nicht die SQL-Injektion.
Dieser Artikel wurde in Verbindung mit Laravel's Eloquent angepasst, um die SQL-Injektion wirksam zu verhindern.
Beispielcode
<?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; } } }
Sie können ihn an Ihre eigenen Bedürfnisse anpassen . Das Folgende ist ein Beispiel für die Verwendung:
// 要批量更新的数组 $students = [ ['id' => 1, 'name' => '张三', 'email' => 'zhansan@qq.com'], ['id' => 2, 'name' => '李四', 'email' => 'lisi@qq.com'], ]; // 批量更新 app(Students::class)->updateBatch($students);
Die generierte SQL-Anweisung lautet wie folgt:
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)
Das obige ist der detaillierte Inhalt vonSo aktualisieren Sie mehrere Datensätze in Laravel stapelweise. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!