You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel模型事件生命周期中retrieved与restored事件解析及示例

嘿,我来帮你把这两个模型事件讲得明明白白,它们对应着Laravel模型生命周期里完全不同的场景,咱们一个个拆解:

1. retrieved 事件:模型被从数据库取出时触发

简单来说,只要你通过Eloquent查询从数据库拿到了一个已存在的模型实例,这个事件就会立刻触发。比如用User::find($id)、User::where('email', 'xxx')->first(),甚至User::withTrashed()->find($id)(查询软删除数据)这类操作,当模型实例被加载到内存的瞬间,retrieved就会执行。

它的典型用途是给刚取出的模型做一些初始化操作,比如添加计算属性、记录查询日志,或者同步一些额外数据。举个实际的例子:

// app/Models/User.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Log;

class User extends Model
{
    protected static function booted()
    {
        static::retrieved(function ($user) {
            // 动态添加「全名」属性,不用每次手动拼接
            $user->full_name = "{$user->first_name} {$user->last_name}";
            
            // 记录该用户被查询的日志,方便排查问题
            Log::info("用户 [ID: {$user->id}] 从数据库被取出,邮箱:{$user->email}");
        });
    }
}

当你执行$user = User::find(1);时,这个闭包会自动运行,你直接用$user->full_name就能拿到拼接好的全名,同时日志里也会留下这条查询记录。

2. restored 事件:软删除模型被恢复时触发

这个事件是和Laravel的软删除功能绑定的。软删除不会真正从数据库删除数据,只是给记录打上deleted_at时间戳标记为已删除。当你调用restore()方法把这条软删除的记录恢复回来时,restored事件就会触发。

它适合做恢复后的联动操作,比如恢复关联数据、发送通知、重置状态等。示例如下(先确保模型开启了软删除):

// app/Models/User.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Mail;
use App\Notifications\UserRestoredNotification;

class User extends Model
{
    use SoftDeletes; // 开启软删除

    protected static function booted()
    {
        static::restored(function ($user) {
            // 恢复用户后,自动把他的关联订单状态改为「活跃」
            $user->orders()->update(['status' => 'active']);
            
            // 给管理员发送邮件通知,告知用户已被恢复
            Mail::to('admin@your-app.com')->send(new UserRestoredNotification($user));
        });
    }
}

假设之前有个用户被软删除了($user->delete();),当你执行User::withTrashed()->find(1)->restore();时,restored事件会立即执行,自动处理订单状态和通知,不用你手动写这些联动逻辑。

核心区别总结

  • retrieved:针对所有从数据库取出的模型实例,是「查询加载完成」的触发点;
  • restored:仅针对软删除模型被恢复这个动作,是「恢复操作完成」的触发点。

内容的提问来源于stack exchange,提问作者MohNj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:48:58