关于模型方法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?
关于 LearnKu
你在$user->save();之前打印呢?
盲猜,模式事件 saved 的回调方法,没有刷新模型,回调执行完后才会刷新模型
因为
saved事件是在\Illuminate\Database\Eloquent\Model::finishSave这里调用, 这里的 saved 事件早于syncOriginal,正因为后面执行syncOriginal,所以当后面尝试调用$user上的getDirty()时才没有结果,这里就可以使用getChanges()获取本次会话中的上一次的变更。看源码:
issues #31061
Eloquent event hooks show odd getDirty() behaviour #31061
这个人在使用
created时遇到了类似问题,得到答复
你先到社区问问,如果是 bug 我再把 issues 打开issues #44891
save() and saveOrFail() functions have different behaviours when using Observer with afterCommit enabled #44891
这个人说
save和saveOrFail在Observer中返回值不同(类似,因为
saveOrFail已经是save之后了)得到答复
就是这样的issues #39943
getOriginal and getRawOriginal returns incorrect values then used within Observer that has afterCommit enabled #39943
上一个问题提及了这个问题,得到了框架作者的回复,但是我看不懂
试下
wasChanged能否解决你在业务中的问题文档里面也有
看源码
看源码