Laravel中如何在updated事件中获取完整的原始Eloquent模型?
问题描述
我有一段触发事件以对比同一模型两个版本的代码,目前通过手动设置“dirty”属性实现了临时解决方案,但想了解是否能在updated事件中获取完整的原始模型。代码如下:
class NovaSubscriptionObserver { public function updated(Subscription $subscription): void { if ($subscription->isDirty('price_id')) { $oldSubscription = $subscription; $oldSubscription->price_id = $subscription->getOriginal('price_id'); SubscriptionCreatedOrUpdatedEvent::dispatch($subscription, $oldSubscription); } } }
解决方案
可以通过克隆模型实例并填充所有原始属性的方式,直接获取完整的更新前模型,无需手动逐个设置字段:
class NovaSubscriptionObserver { public function updated(Subscription $subscription): void { if ($subscription->isDirty('price_id')) { // 克隆独立的模型实例,避免修改原更新后的模型 $oldSubscription = clone $subscription; // 将所有字段的原始值填充到克隆实例中 $oldSubscription->fill($subscription->getOriginal()); SubscriptionCreatedOrUpdatedEvent::dispatch($subscription, $oldSubscription); } } }
- 关键说明:
clone $subscription创建全新的模型实例,和原更新后的实例无引用关联,不会互相干扰;getOriginal()返回模型所有字段更新前的原始值数组,通过fill()赋值后,克隆实例完全对应更新前的模型状态;- 这种写法扩展性更强,后续模型新增字段时不需要修改这段代码。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

