Laravel如何批量更新数据_Laravel批量更新数据方法【详解】

浅辰小哥_5529

浅辰小哥_5529

2026-05-07

841人浏览

原创

Laravel批量更新需按场景选择方案:统一值用whereIn+update;不同值优先upsert(需唯一索引);数值增减用increment/decrement;复杂场景用原生SQL。

laravel如何批量更新数据_laravel批量更新数据方法【详解】

Laravel 没有内置的「按每条记录不同值」批量更新方法,直接循环 save() 或 update() 会生成 N 条 SQL,性能崩盘;真正高效的方案取决于你的数据结构和场景——不是选“哪个方法最酷”,而是看“哪条路不踩坑”。

统一字段值更新:用 whereIn() + update() 最稳

这是最常见、最安全、也最容易被忽略适用边界的场景:所有目标记录要更新成**相同的值**。

  • 比如把订单状态批量设为 2、把一批用户的 is_active 全改为 1
  • 底层走的是单条 UPDATE ... WHERE id IN (?, ?, ?),数据库原生支持,无兼容性问题
  • 注意 whereIn() 参数必须是纯数值数组,不能是字符串(如 "1,2,3"),否则报错 Incorrect integer value
  • 若 ID 数量超千条,MySQL 默认 max_allowed_packet 可能触发 PDOException: SQLSTATE[HY000]: General error: 1390,需分批或改用原生 SQL

示例:

laravel-specialist
laravel-specialist

精通 Laravel 10+,遵循现代 PHP 实践的 Laravel 专家。擅长优雅语法、Eloquent ORM、队列系统及企业级特性...

下载
$orderIds = [1, 5, 8, 12];<br>DB::table('orders')->whereIn('id', $orderIds)->update(['status' => 2]);

每条记录不同值更新:优先用 upsert()(Laravel 9+)

当你有一组带主键/唯一键的数据,想「存在就更新,不存在就插入」,且每条更新字段值不同(如批量修正商品价格、库存),upsert() 是目前最接近“优雅”的原生方案。

  • 必须有唯一索引支撑(如 id、sku、email),否则无法判断“哪条算冲突”
  • 第二个参数是匹配字段数组(['id']),第三个是允许更新字段(['price', 'stock']),别把 id 再塞进第三个参数里
  • SQLite 用户注意:仅支持 3.24+,旧版直接抛 BadMethodCallException
  • 不触发模型事件(updating、updated)、不走访问器/修改器,纯 SQL 层操作

示例:

$data = [<br>    ['id' => 1, 'name' => 'iPhone', 'price' => 6999],<br>    ['id' => 2, 'name' => 'iPad', 'price' => 3299],<br>];<br>Product::upsert($data, ['id'], ['name', 'price']);

数值字段递增/递减:用 increment() 或 decrement()

当你要对多个记录的数值字段做「在原值基础上加减」(如库存入库、点赞数+1、阅读量+1),千万别先查再改——竞态条件和 N+1 查询一起炸。

  • increment('quantity', 5) 底层生成 UPDATE SET quantity = quantity + 5,原子性由数据库保证
  • 它只支持单字段、单值增量;如果要同时更新 quantity 和 updated_at,得用 DB::raw() 拼写:['quantity' => DB::raw('quantity + 5'), 'updated_at' => now()]
  • 大批量(>500 条)仍建议避免循环调用,可结合 DB::table()->whereIn()->update() 配合 DB::raw() 写条件表达式

示例:

foreach ([1 => 5, 2 => 3, 3 => 8] as $id => $add) {<br>    Product::findOrFail($id)->increment('stock', $add);<br>}

复杂逻辑或超大数据量:绕过 Eloquent,手写原生 SQL

当你要更新上万条记录、字段逻辑嵌套(如根据其他表子查询计算新值)、或需要极致性能时,Eloquent 的开销(模型实例化、事件、类型转换)就成了瓶颈。

  • 直接用 DB::statement() 或 DB::update() 执行拼好的 SQL,绑定参数防注入
  • 参考 CASE WHEN 模式:用 CASE WHEN id = ? THEN ? ... END 实现每行不同值更新(如知识库中 updateBatch() 方法)
  • 务必校验输入字段是否存在于表结构中,否则易触发 SQLSTATE[42S22]: Column not found
  • 事务中慎用:长事务 + 大量 WHERE IN 可能锁表,尤其在高并发写场景

关键点不是“能不能写”,而是“要不要承担维护成本”——这种 SQL 一旦业务变更,比 Eloquent 更难调试和复用。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

laravel

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

857

10

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

2024.04.09

855

9

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

2508

10

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

4441

7

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

2025.08.05

6470

22

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

2025.08.05

4276

13

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.05

7989

7

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

2026.03.04

1496

29

Laravel 框架安装指南
Laravel 框架安装指南

本指南详解 Laravel 框架安装全流程,涵盖 PHP 8.1+ 环境配置、Composer 依赖管理工具安装及国内镜像源优化。重点演示使用 composer create-project 命令创建 Laravel 10/11 项目,解决常见安装错误与依赖冲突。从环境搭建到项目初始化,助您快速完成 Laravel 开发环境部署,为后续 Web 应用开发奠定基础。适合 PHP 初学者与框架迁移开发者参考。

2026.04.09

215

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 213人学习

Composer手册
Composer手册

共0课时 | 0人学习