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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:40:21