我目前正在研究Laravel 5.8项目,并且在更新模型时注意到,即使模型没有任何更改,我仍将同一模型保存回数据库中。
我为避免这种情况的想法如下:
$model = Model::find($id);
$model->fill([
"name" => $request->name,
...
]);
if($model->isDirty){
$model->save()
}
问题是,即使我不更改模型中的值,我仍要输入if()
条件并保存模型。我尝试使用临时变量并调试了$model->getChanges()
,但得到了一个空数组。
这是预期的行为吗?
答案 0 :(得分:1)
有区别。
isDirty代码
cursorWordPartRightSelect
getChanges()和getDirty代码
/**
* Determine if the model or any of the given attribute(s) have been modified.
*
* @param array|string|null $attributes
* @return bool
*/
public function isDirty($attributes = null)
{
return $this->hasChanges(
$this->getDirty(), is_array($attributes) ? $attributes : func_get_args()
);
}
总结。
此帖子中使用的答案:https://laracasts.com/discuss/channels/eloquent/observer-column-update-isdirty-or-waschanged
在保存之前使用isDirty(和getDirty)来查看哪些属性 从数据库中检索到的时间之间进行了更改 和通话时间,同时使用wasChanged(和getChanges) 保存后,查看属性在上一次已更改/更新 保存(从代码到数据库)。
获得isDirty检查的原因是在检查之前您执行了fill()。我认为这将自动填充updated_at。因此,实际上,在这种情况下,该模型已更改。