Eloquent 中不存在“Attribute Recoverability States”这一官方概念,它只是对软删除、属性快照和时间旅行恢复的非标准拼凑说法;Laravel 原生仅支持通过 SoftDeletes 实现逻辑删除与 restore() 恢复,不保存属性历史值。

什么是 Eloquent Attribute Recoverability States?
PHP 里没有叫 Attribute Recoverability States 的原生概念,Laravel 的 Eloquent 也没有这个官方术语。它不是模型属性的内置状态机制,也不是 Laravel 文档中定义的功能。如果你在某篇博客或内部文档里看到这个词,大概率是有人把「软删除 + 属性快照 + 时间旅行式恢复」这几个能力拼凑起来,自造的一个营销型说法。
软删除(Soft Deletes)是可恢复性的基础
真正能支撑“恢复”行为的,只有 SoftDeletes trait 和配套字段 deleted_at。它不保存历史值,只标记逻辑删除状态:
- 启用方式:在模型中 use
Illuminate\Database\Eloquent\SoftDeletes,并确保数据表有deleted_at字段(类型为TIMESTAMP NULL) - 恢复操作就是调用
restore()—— 它只清空deleted_at,不会还原任何被修改过的属性值 -
withTrashed()和onlyTrashed()用于查询,但它们不提供“恢复到某次修改前”的能力
想恢复属性历史值?得自己存快照
如果业务真需要“把 title 恢复回 3 小时前的值”,Eloquent 本身不提供该功能。你必须额外设计版本机制:
- 方案一:用
laravel-versions或spatie/laravel-model-states这类包,但注意它们解决的是「状态机流转」,不是「属性级时间回滚」 - 方案二:手动记录变更 —— 在
saving或updating事件里,对比$model->getOriginal('xxx')和$model->xxx,把旧值写进model_history表 - 方案三:用数据库级别的 CDC(如 PostgreSQL 的 logical replication)或触发器捕获变更,但复杂度陡增,且脱离 PHP/Eloquent 控制流
示例(简易快照保存):
立即学习“PHP免费学习笔记(深入)”;
public 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
}
});
}
别混淆「可恢复」和「可撤销」
很多团队误以为加了 SoftDeletes 就等于具备灾难恢复能力。实际上:
- 软删除不能防误 update —— 如果你执行了
User::where(...)->update(['name' => 'xxx']),restore()帮不上忙 - 事务(
DB::transaction)只能防止部分失败,无法回滚已提交的变更 - 真正的灾难恢复依赖备份策略(如 mysqldump 定时 + binlog)、读写分离下的从库延迟回滚,或应用层的 Command Sourcing/CQRS 架构
所谓“Laravel 灾难恢复能力”,从来不在框架内建功能里,而在你是否愿意为关键模型设计变更追踪、是否配置了可靠的数据库备份与 PITR(Point-in-Time Recovery)。



















