thinkphp软删除无全局配置开关,必须在每个模型中显式启用:引入softdelete trait、设置$deletetime和$usesoftdelete=true,并确保数据库字段为可空datetime类型。

ThinkPHP 没有数据库配置文件级别的软删除全局开关。软删除不是通过 config/database.php 或其他全局配置项开启的功能,它完全由模型层控制,依赖模型配置、数据库字段定义、调用方式三者严格对齐。
也就是说:
你不能在 database.php 里写个 'soft_delete' => true 就让所有表自动启用软删除;
也不能靠改数据库连接配置来统一启用或禁用该功能。
✅ 正确做法:每个模型单独配置
软删除必须在具体模型类中显式启用,步骤如下:
-
引入 trait
use think\model\concern\SoftDelete;
-
声明使用 trait 并指定字段
use SoftDelete; protected $deleteTime = 'delete_time'; // 即使是默认名也建议写上 protected $useSoftDelete = true; // TP6 必须显式设为 true
-
若字段是整型时间戳(如 BIGINT),还需声明类型:
protected $type = ['delete_time' => 'integer'];
避免与自动时间戳冲突:
不要把delete_time加入$createTime或$updateTime,否则新记录插入时就带值,被误判为已删除。
❌ 常见误解与错误尝试
- 在
database.php中添加soft_delete => true—— 无效,框架不识别该配置 - 以为设置
$defaultSoftDelete就能全局生效 —— TP6 已废弃该属性,仅 TP5 部分场景支持布尔型软删 - 用 Db 类操作(如
Db::name('user')->delete(1))期望触发软删 —— 完全绕过模型逻辑,直接物理删除
? 补充:字段要求(数据库侧)
- 字段名推荐
delete_time(TP6 硬编码绑定,默认只认这个) - 类型必须为可空的
DATETIME NULL DEFAULT NULL(MySQL) - 绝对禁止
NOT NULL或DEFAULT CURRENT_TIMESTAMP - 修改字段后务必清空
runtime/cache/,否则模型可能缓存旧结构导致失效
软删除本质是模型行为,不是数据库中间件或连接配置项。它的“全局性”只能靠开发规范实现——比如统一基类继承、代码审查、模板化模型生成等,而非靠配置文件一键开启。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











