Laravel模型事件生命周期中retrieved与restored事件解析及示例
嘿,我来帮你把这两个模型事件讲得明明白白,它们对应着Laravel模型生命周期里完全不同的场景,咱们一个个拆解:
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就能拿到拼接好的全名,同时日志里也会留下这条查询记录。
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

