So aktualisieren Sie mehrere Datensätze in Laravel stapelweise

黄舟
Freigeben: 2023-03-16 18:30:01
Original
2908 Leute haben es durchsucht

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 = &#39;students&#39;;
 //批量更新
 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[&#39;id&#39;]) ? &#39;id&#39; : 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(&#39;, &#39;, $sets);
   $whereIn = collect($multipleData)->pluck($referenceColumn)->values()->all();
   $bindings = array_merge($bindings, $whereIn);
   $whereIn = rtrim(str_repeat(&#39;?,&#39;, count($whereIn)), &#39;,&#39;);
   $updateSql = rtrim($updateSql, ", ") . " WHERE `" . $referenceColumn . "` IN (" . $whereIn . ")";
   // 传入预处理sql语句和对应绑定数据
   return DB::update($updateSql, $bindings);
  } catch (\Exception $e) {
   return false;
  }
 }
}
Nach dem Login kopieren

Sie können ihn an Ihre eigenen Bedürfnisse anpassen . Das Folgende ist ein Beispiel für die Verwendung:


// 要批量更新的数组
$students = [
 [&#39;id&#39; => 1, &#39;name&#39; => &#39;张三&#39;, &#39;email&#39; => &#39;zhansan@qq.com&#39;],
 [&#39;id&#39; => 2, &#39;name&#39; => &#39;李四&#39;, &#39;email&#39; => &#39;lisi@qq.com&#39;],
];
// 批量更新
app(Students::class)->updateBatch($students);
Nach dem Login kopieren

Die generierte SQL-Anweisung lautet wie folgt:


UPDATE pre_students
SET NAME = CASE
WHEN id = 1 THEN
 &#39;张三&#39;
WHEN id = 2 THEN
 &#39;李四&#39;
ELSE
 NAME
END,
 email = CASE
WHEN id = 1 THEN
 &#39;zhansan@qq.com&#39;
WHEN id = 2 THEN
 &#39;lisi@qq.com&#39;
ELSE
 email
END
WHERE
 id IN (1, 2)
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage