Laravel Eloquent模型事件:updating与updated的区别是什么?
嘿,我之前也跟你有过一样的误解!让我把Laravel Eloquent里updating和updated这两个事件的区别,还有它们的触发逻辑给你讲明白:
Eloquent
updating 与 updated 事件的核心区别 首先得先澄清你提到的触发前提:这两个事件确实都只会在模型属性发生了会导致数据库变更的修改时才会触发。如果只是调用save()但没有任何属性和数据库里的原值不一样,Laravel会直接跳过更新流程,自然也不会触发这两个事件——这是框架的优化逻辑,避免无意义的数据库操作和事件调度。
接下来具体说两者的差异:
1. updating 事件:更新前的拦截与调整
这个事件在数据库执行更新语句之前触发,是你对模型做最后调整甚至终止更新的机会:
- 你可以在这里修改模型的属性值,比如统一处理时间戳、格式化字段内容;
- 如果返回
false,整个更新操作会被立即终止,数据库不会有任何变化; - 适合做更新前的验证、数据修正。
举个实际的例子:
User::updating(function ($user) { // 强制更新最后操作时间 $user->last_operated_at = now(); // 如果用户已被封禁,阻止更新 if ($user->status === 'banned') { return false; } });
2. updated 事件:更新完成后的后续操作
这个事件在数据库更新语句成功执行之后触发,此时数据库里的数据已经是最新状态:
- 你可以在这里做更新后的收尾工作,比如记录操作日志、清理相关缓存、触发关联的业务流程;
- 无法再终止更新(因为已经完成了);
- 适合做依赖最新数据的后续任务。
例子如下:
User::updated(function ($user) { // 记录用户信息更新日志 Log::info("用户 [ID: {$user->id}] 的个人信息已更新"); // 清理用户资料的缓存 Cache::forget("user_profile_{$user->id}"); });
额外补充:如何强制触发逻辑?
如果你需要不管模型有没有变更,只要调用save()就执行某些逻辑,那这两个事件就不适用了。你可以直接在save()调用前后手动执行代码,或者如果只是需要更新时间戳,可以用$user->touch()方法(这个方法会强制更新updated_at字段,同时触发touched事件)。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

