在 Eloquent 模型事件中获取先前的属性值

Posted

技术标签:

【中文标题】在 Eloquent 模型事件中获取先前的属性值【英文标题】:Get previous attribute value in Eloquent model event 【发布时间】:2013-06-26 09:14:21 【问题描述】:

有没有办法在其savingupdating 事件中查看模型属性的旧值/先前值?

例如。是否可能出现以下情况:

User::updating(function($user)

    if ($user->username != $user->old->username) doSomething();
);

【问题讨论】:

【参考方案1】:

好的,我很偶然地发现了这个,因为它目前不在文档中......

有一个getOriginal() 方法可用,它返回原始属性值的数组:

User::updating(function($user)

    if ($user->username != $user->getOriginal('username')) 
        doSomething();
    

    // If you need multiple attributes you may use:
    // $originalAttributes = $user->getOriginal();
    // $originalUsername = $originalAttributes['username']; 
);

小心,在 Laravel 7 之前 getOriginal 会忽略属性类型转换。

【讨论】:

getOriginal 有一个参数,即您要查找的字段的名称。 你知道是返回前一个对象还是返回第一个值? 小心,它忽略了模型类型转换。 请注意,从 Laravel 7.x 开始,此方法已重命名为 getRawOriginal()。请参阅升级指南:laravel.com/docs/7.x/upgrade @RobinvanBaalen - 我还没有测试过,但是自 Laravel 7 以来 getOriginal 的新行为实际上似乎 more 适合进行这些比较,因为我期望当前的属性值已经应用了强制转换...【参考方案2】:

在 Laravel 4.0 和 4.1 中,您可以通过isDirty() method 进行检查:

User::updating(function($user)

    if ($user->isDirty('username'))
        doSomething();
    
);

【讨论】:

也适用于 5.2.39。谢谢奥拉。 这没有得到之前的值【参考方案3】:

你可以重载方法,然后调用父方法。

【讨论】:

现在我们可以在 class AppServiceProvider extends ServiceProvider 使用 boot 方法中进行操作。

以上是关于在 Eloquent 模型事件中获取先前的属性值的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 访问原文

Laravel Eloquent - 如何将范围查询内的计算值作为模型列或集合属性返回

如何为 Laravel / Eloquent 模型设置默认属性值?

试图在 laravel eloquent 中获取非对象错误的属性“名称”

Laravel Eloquent ORM字段处理

如何在 Eloquent 查询关系中使用模型的属性