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

如何手动触发Laravel模型事件?数据未变更时的触发方法

手动触发Laravel模型事件的方案

当模型数据没有变更时,Laravel会通过isDirty()检查跳过update查询,自然也不会触发updated事件。刚好碰到过类似的场景,我来给你梳理一下对应的解决方案:

一、通用手动触发模型事件的方法

Laravel自带了直接触发事件的方式,不管当前模型状态如何都能调用:

  • 使用模型原生的fireModelEvent()方法
    这是最直接的方式,你可以指定要触发的事件名称(比如updated、created等),完全跳过isDirty()检查:

    // 直接触发updated事件,无需修改任何数据
    $yourModel->fireModelEvent('updated');
    

    调用后会直接触发该事件对应的所有监听器逻辑。

  • 直接分发自定义事件类
    如果你是通过自定义事件类(比如App\Events\ModelUpdated)来处理模型事件的,可以直接用事件门面或辅助函数分发:

    use App\Events\ModelUpdated;
    
    // 传入模型实例,直接分发事件
    event(new ModelUpdated($yourModel));
    

二、针对「数据无变更仍需触发updated事件」的专属方案

如果除了触发事件,你还需要模拟真实的update流程(比如更新时间戳、让后续逻辑感知到模型已更新),可以用下面的方案:

  • 使用touch()方法
    这个方法会自动更新模型的updated_at字段(前提是模型有这个字段),同时触发updated和touched事件,完美适配不需要修改其他字段,只是想触发事件的场景:

    // 更新updated_at并触发updated事件
    $yourModel->touch();
    
  • 强制标记字段为「脏」并保存
    如果你需要修改某个特定字段(或者只是想让isDirty()返回true),可以用forceFill()设置字段值,然后调用save()触发update和事件:

    // 强制设置updated_at为当前时间,标记为脏状态
    $yourModel->forceFill(['updated_at' => now()])->save();
    

    这样Laravel会执行update查询,同时触发updated事件。

总结

  • 单纯需要触发事件:用fireModelEvent('updated')最便捷
  • 需要更新时间戳+触发事件:用touch()最优雅
  • 需要修改特定字段并触发事件:用forceFill()+save()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:14:06