Eloquent 中不存在“Attribute Recoverability States”这一官方概念,它只是对软删除、属性快照和时间旅行恢复的非标准拼凑说法;Laravel 原生仅支持通过 SoftDeletes 实现逻辑删除与 restore() 恢复,不保存属性历史值。
什么是 Eloquent Attribute Recoverability States?
PHP 里没有叫
的原生概念,Laravel 的 Eloquent 也没有这个官方术语。它不是模型属性的内置状态机制,也不是 Laravel 文档中定义的功能。如果你在某篇博客或内部文档里看到这个词,大概率是有人把「软删除 + 属性快照 + 时间旅行式恢复」这几个能力拼凑起来,自造的一个营销型说法。
软删除(Soft Deletes)是可恢复性的基础
真正能支撑“恢复”行为的,只有
trait 和配套字段
。它不保存历史值,只标记逻辑删除状态:
启用方式:在模型中 use
,并确保数据表有
字段(类型为
)
恢复操作就是调用
—— 它只清空
,不会还原任何被修改过的属性值
和
用于查询,但它们不提供“恢复到某次修改前”的能力
想恢复属性历史值?得自己存快照
如果业务真需要“把
恢复回 3 小时前的值”,Eloquent 本身不提供该功能。你必须额外设计版本机制:
方案一:用
或
这类包,但注意它们解决的是「状态机流转」,不是「属性级时间回滚」
方案二:手动记录变更 —— 在
或
事件里,对比
和
,把旧值写进
表
方案三:用数据库级别的 CDC(如 PostgreSQL 的 logical replication)或触发器捕获变更,但复杂度陡增,且脱离 PHP/Eloquent 控制流
示例(简易快照保存):
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
别混淆「可恢复」和「可撤销」
很多团队误以为加了
就等于具备灾难恢复能力。实际上:
软删除不能防误 update —— 如果你执行了
,
帮不上忙
事务(
)只能防止部分失败,无法回滚已提交的变更
真正的灾难恢复依赖备份策略(如 mysqldump 定时 + binlog)、读写分离下的从库延迟回滚,或应用层的 Command Sourcing/CQRS 架构
所谓“Laravel 灾难恢复能力”,从来不在框架内建功能里,而在你是否愿意为关键模型设计变更追踪、是否配置了可靠的数据库备份与 PITR(Point-in-Time Recovery)。
Attribute Recoverability StatesSoftDeletesdeleted_atIlluminate\Database\Eloquent\SoftDeletesdeleted_atTIMESTAMP NULLrestore()deleted_atwithTrashed()onlyTrashed()titlelaravel-versionsspatie/laravel-model-statessavingupdating$model->getOriginal('xxx')$model->xxxmodel_historypublic static function boot()
{
parent::boot();
static::updating(function ($model) {
$changed = $model->getChanges();
foreach ($changed as $key => $value) {
$original = $model->getOriginal($key);
// 写入 history 表:model_id, attribute, old_value, new_value, updated_at
}
});
}SoftDeletesUser::where(...)->update(['name' => 'xxx'])restore()DB::transaction