ThinkPHP模型更新数据主要有save()和update()两种方式:按主键更新用User::update()或where()->update();需验证/事件时先get()再save();批量更新用saveAll();高级操作支持allowField()、inc()、exp()等。

ThinkPHP模型更新数据有多种方式,核心围绕 save() 和 update() 两大方法展开,不同场景适用不同写法。关键看你是想按主键更新、条件更新、批量更新,还是需要验证、过滤字段或强制写入。
按主键直接更新(最常用)
适合已知主键(如 id),且数据中包含主键值:
-
使用 `Model::update()` 静态方法:传入完整数据(含主键),框架自动识别条件
`User::update(['id' => 5, 'name' => '新名字', 'email' => 'new@ex.com']);` -
使用 `where()->update()`:显式指定条件,更清晰可控
`User::where('id', 5)->update(['name' => '新名字']);`
先查后改再保存(支持验证和事件)
适合需要触发模型验证、自动时间戳、修改器(mutator)或事件回调的场景:
- 先用 `Model::get($id)` 获取实例,赋值后再调用 `save()`
`$user = User::get(5); $user->name = '张三'; $user->save();` - 若数据来自 POST,可配合 `validate(true)` 和 `isUpdate(true)` 显式声明为更新操作:
`$user = new User(); $user->validate(true)->isUpdate(true)->save($_POST);`
批量更新多条记录
适用于根据主键批量修改(如后台勾选多条用户启用/禁用):
立即学习“PHP免费学习笔记(深入)”;
-
`saveAll()` 支持数组集合,每条必须含主键
`User::saveAll([['id'=>1,'status'=>1], ['id'=>2,'status'=>0]]);` - 若需强制更新(即使字段值未变也执行 SQL),加 `force()`:
`User::get(1)->force()->save(['name'=>'test']);`
高级更新技巧
处理特殊需求时可用这些方式:
-
只允许特定字段更新:防止意外写入敏感字段
`$user->allowField(['name','email'])->save(['name'=>'x','email'=>'y'], ['id'=>5]);` -
字段自增/自减:无需读取原值
`User::where('id', 5)->inc('score', 10)->update();` -
用 SQL 函数更新:如转大写、计算字段
`User::where('id', 5)->exp('name', 'UPPER(name)')->update();`
或使用 `Db::raw()`:
`User::where('id', 5)->update(['name' => Db::raw('UPPER(name)')]);`



















