laravel中批量更新多条记录的实现方法

黄舟
Lepaskan: 2023-03-16 18:30:01
asal
2882 orang telah melayarinya

前言

相信熟悉laravel的童鞋都知道,laravel有批量一次性插入多条记录,却没有一次性按条件更新多条记录。

是否羡慕thinkphp的saveAll,是否羡慕ci的update_batch,但如此优雅的laravel怎么就没有类似的批量更新的方法呢?

高手在民间

Google了一下,发现stackoverflow( https://stackoverflow.com/questions/26133977/laravel-bulk-update )上已经有人写好了,但是并不能防止sql注入。

本篇文章,结合laravel的Eloquent做了调整,可有效防止sql注入。

示例代码


<?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;
  }
 }
}
Salin selepas log masuk

可以根据自己的需求再做调整,下面是用法实例:


// 要批量更新的数组
$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);
Salin selepas log masuk

生成的SQL语句如下:


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)
Salin selepas log masuk

Atas ialah kandungan terperinci laravel中批量更新多条记录的实现方法. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!