Hyperf模型软删除需手动启用,通过继承SoftDeletes Trait并确保deleted_at字段存在;默认查询自动过滤已软删数据,可用withTrashed()或onlyTrashed()扩展查询范围。

Hyperf 模型的软删除不是开箱即用的默认行为,需要手动启用并配置。核心是让模型支持 deleted_at 字段,并在查询、删除、恢复等操作中自动识别该字段状态。
启用软删除:继承 SoftDeletes Trait
在模型类中使用 Hyperf\Database\Model\SoftDeletes Trait,并确保数据库表含有 deleted_at 字段(类型为 DATETIME 或 TIMESTAMP,允许为 NULL):
- 建表时添加字段:
$table->softDeletes();(迁移中) - 模型中声明:
use Hyperf\Database\Model\SoftDeletes; - 在类定义中混入:
use SoftDeletes; - 可选:指定字段名(如用
is_deleted或deleted_time),需重写$dates和$deletedAtColumn属性
软删除与常规查询自动隔离
启用后,所有 Model::query()、Model::find()、where() 等常规查询会自动过滤掉 deleted_at IS NOT NULL 的记录 —— 即默认不查已软删数据。
- 想查包括软删数据?用
withTrashed() - 只想查已软删数据?用
onlyTrashed() - 恢复单条记录:
$model->restore() - 强制物理删除:
$model->forceDelete()
恢复与批量操作支持
Hyperf 提供了 restore() 和 restoreMany() 方法,也支持带条件的恢复:
User::withTrashed()->where('id', 123)->restore()User::onlyTrashed()->whereIn('id', [1,2,3])->restore()- 调用
createOrRestore()可根据唯一字段(如 email)尝试创建或恢复已软删记录
监听软删除生命周期事件
软删除过程会触发特定事件,可用于日志、清理关联数据等:
-
deleting:删除前(软删或硬删都会触发) -
deleted:删除后(含软删) -
restoring:恢复前 -
restored:恢复后 - 监听方式:通过
#[ModelListener]注解 + 实现对应事件类(如Deleting)
不复杂但容易忽略的是字段类型和迁移同步 —— 忘记加 softDeletes() 或字段类型不匹配,会导致软删逻辑静默失效。










