Laravel 9模型boot方法updating/updated钩子失效问题
解决Laravel 9模型updating钩子普通更新无效的问题
可能的原因及解决方案
1. 事件未正确注册到模型的boot()方法
这是最常见的问题:如果你的updating钩子代码没有放在模型的boot()方法内,事件根本不会被Laravel注册,自然无法触发。
正确的代码示例:
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Facades\Auth; class Head extends Model { use SoftDeletes; // 如果你使用了软删除 // 确保包含需要批量赋值的字段,包括updated_by、deleted_by protected $fillable = ['title', 'account_type', 'updated_by', 'deleted_by']; protected static function boot() { parent::boot(); // 必须调用父类的boot方法 // 注册updating钩子 static::updating(function ($model) { // 先判断用户是否已认证,避免未登录场景报错 if ($user = Auth::user()) { $model->updated_by = $user->id; } }); // 建议用deleting钩子处理软删除时的deleted_by赋值(而非依赖updating) static::deleting(function ($model) { if ($user = Auth::user()) { $model->deleted_by = $user->id; } }); } }
2. 确认更新操作触发的是模型实例方法
你当前的更新代码Head::find($request->head_id)->update($data)是正确的(调用模型实例的update()方法),会触发模型事件。但如果是用查询构建器批量更新(如下),则不会触发模型事件:
// 这种写法不会触发updating/updated钩子 Head::where('id', $request->head_id)->update($data);
确保你始终使用模型实例的update()方法来触发事件。
3. 检查认证状态与字段有效性
- 确认执行更新操作的请求已通过认证:如果
Auth::user()为空,updated_by字段不会被赋值。可以在钩子中添加日志排查:static::updating(function ($model) { \Log::info('Updating hook triggered', ['user' => Auth::user()?->id]); if ($user = Auth::user()) { $model->updated_by = $user->id; } }); - 确认数据库中存在
updated_by字段,且字段类型与用户ID匹配(如INT类型)。
内容的提问来源于stack exchange,提问作者Arsalan Ahmed
相关产品推荐
相关产品推荐

