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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:23:18