关于模型方法isDirty的疑问

代码

<?php

class User extends Model
{
    protected static function booted()
    {
        static::saved(function (self $user) {
            //true,这是疑问点:这里应该是输出false才符合逻辑才对
            var_dump($user->isDirty('password'));
        });
    }
}

$user = User::find(1);
$user->password = time();
$user->save();

//false
var_dump($user->isDirty('password'));

问题

为什么在模型事件中的isDirty(‘password’)是true?

让PHP再次伟大
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10

因为 saved 事件是在 \Illuminate\Database\Eloquent\Model::finishSave 这里调用, 这里的 saved 事件早于 syncOriginal,正因为后面执行 syncOriginal ,所以当后面尝试调用 $user 上的 getDirty() 时才没有结果,这里就可以使用 getChanges() 获取本次会话中的上一次的变更。

看源码:

Laravel

1年前 评论
Mutoulee

你在$user->save();之前打印呢?

1年前 评论
勇敢的心 (楼主) 1年前
Mutoulee (作者) 1年前

盲猜,模式事件 saved 的回调方法,没有刷新模型,回调执行完后才会刷新模型

1年前 评论

翻了 GitHub 大概结论是 就是这样的,我先把问题关了 (有些老外的回答我不太理解)

issues #31061

Eloquent event hooks show odd getDirty() behaviour #31061

这个人在使用 created 时遇到了类似问题,
得到答复 你先到社区问问,如果是 bug 我再把 issues 打开

file

issues #44891

save() and saveOrFail() functions have different behaviours when using Observer with afterCommit enabled #44891

这个人说 savesaveOrFailObserver 中返回值不同
(类似,因为 saveOrFail 已经是 save 之后了)
得到答复 就是这样的

file

issues #39943

getOriginal and getRawOriginal returns incorrect values then used within Observer that has afterCommit enabled #39943
上一个问题提及了这个问题,得到了框架作者的回复,但是我看不懂

file

试下 wasChanged 能否解决你在 业务中的 问题

file
Laravel

1年前 评论
sreio

file

文档里面也有

1年前 评论
sreio (作者) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!