ThinkPHP 6.0支持硬删除与软删除:硬删除用destroy()或delete()物理移除数据;软删除需引入SoftDelete trait并配置delete_time字段,通过withTrashed()等方法管理已删记录。

ThinkPHP 6.0 提供了多种数据删除方式,既支持硬删除(物理删除),也支持软删除(逻辑标记),具体用法取决于业务需求和模型配置。
普通硬删除:直接移除数据库记录
适用于无需保留历史、可彻底清除的场景。常用方法有:
-
实例删除:先查出模型对象,再调用
delete()方法$user = UserModel::find(123); $user?->delete(); -
静态批量删除:通过主键或条件直接删除,不经过查询
UserModel::destroy(123);(单条)UserModel::destroy([1, 2, 3]);(多条主键)UserModel::destroy(['status' => 0]);(按条件) -
Db 类原生删除:绕过模型,直接操作数据库
Db::name('user')->where('id', 123)->delete();
启用软删除:标记删除而非真正删除
需在模型中显式开启,适合需要审计、恢复或防止误删的业务。
- 模型类引入
SoftDeletetrait,并指定删除时间字段:use think\model\concern\SoftDelete;class User extends Model { use SoftDelete; protected $deleteTime = 'delete_time'; } - 数据库表中添加
delete_time字段(类型 DATETIME/TIMESTAMP,允许 NULL) - 调用
delete()后,该字段被写入当前时间,记录仍保留在库中 - 默认查询自动排除
delete_time IS NOT NULL的数据;如需查看已删除项,可用:UserModel::withTrashed()->select();(含已删)UserModel::onlyTrashed()->select();(仅已删)$user->restore();(恢复单条)
控制器中处理删除请求(含前端配合)
Web 表单通常只支持 GET/POST,删除需伪造 HTTP DELETE 方法:
- 前端表单中加入隐藏字段:
- 控制器对应方法接收并执行:
public function delete($id) { return UserModel::destroy($id) ? 'success' : 'fail'; } - 路由需启用资源路由或手动定义 DELETE 路由规则,确保框架能识别该请求类型
注意事项与常见问题
删除操作看似简单,但几个细节容易引发异常:
-
destroy()返回影响行数(int),不是布尔值;0 表示无匹配记录,不等于失败 - 使用软删除时,
destroy()默认仍为软删除行为,除非显式调用force(true) - 事务中执行删除,务必捕获异常并手动回滚,否则部分失败可能被忽略
- 批量删除大量数据时,建议分批次处理(如每次 500 条),避免超时或内存溢出
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











