ThinkPHP 6.0 更新数据推荐使用 Db::name('table')->update(),支持条件更新、主键自动识别、表达式/函数更新及自增/自减;批量更新需循环或原生SQL实现。

ThinkPHP 6.0 修改数据表中的数据,核心是使用 Db 查询构建器或模型类的更新方法。推荐优先用 Db::name('table')->update() 形式,写法直接、性能稳定、逻辑清晰。
基础更新:按条件修改单条或多条记录
最常用的方式是先加 where 条件,再调用 update():
Db::name('user')->where('id', 1)->update(['name' => '新名字', 'status' => 1]);- 返回值是影响的行数(如成功修改 1 行则返回 1,没匹配到数据返回 0)
- 字段名必须与数据库列名严格一致(比如是
create_time就不能写成created_at)
简化写法:数据含主键时可省略 where
如果传入的数据数组里已包含主键(如 id),框架会自动识别并生成 WHERE 条件:
Db::name('user')->update(['id' => 1, 'name' => '张三', 'score' => 95]);- 等价于上一种写法,SQL 是
UPDATE `user` SET `name` = '张三', `score` = 95 WHERE `id` = 1 - 注意:仅当主键字段存在且值有效时才适用,否则可能误更新或报错
高级更新:支持表达式、函数和自增/自减
需要执行 SQL 函数或字段运算时,用 exp() 或 raw() 方法:
立即学习“PHP免费学习笔记(深入)”;
- 把字段设为大写:
Db::name('user')->where('id', 1)->exp('name', 'UPPER(name)')->update(); - 多个字段用函数更新:
Db::name('user')->where('id', 1)->update(['name' => Db::raw('UPPER(name)'), 'read_time' => Db::raw('read_time + 1')]); - 自增分数:
Db::name('user')->where('id', 1)->inc('score', 5)->update();
批量更新:一次改多条,但需谨慎使用
TP6 不直接提供“按条件批量更新不同值”的原生接口(如一条 SQL 改 100 行每行值不同),常见做法有:
- 用循环 + 单条 update(适合几百条以内,逻辑简单)
- 用原生 SQL 拼接 CASE WHEN(适合万级同表批量差异更新,性能高但需手写 SQL)
- 避免在事务外大量循环 update,建议包裹
Db::startTrans()和Db::commit()



















