如何手动触发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
相关产品推荐
相关产品推荐

