在 Eloquent 模型事件中获取先前的属性值
Posted
技术标签:
【中文标题】在 Eloquent 模型事件中获取先前的属性值【英文标题】:Get previous attribute value in Eloquent model event 【发布时间】:2013-06-26 09:14:21 【问题描述】:有没有办法在其saving
或updating
事件中查看模型属性的旧值/先前值?
例如。是否可能出现以下情况:
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 模型设置默认属性值?