雄辩的`isDirty()`和`getChanges()`之间的不一致

时间:2019-10-09 20:45:27

标签: laravel-5 eloquent

我目前正在研究Laravel 5.8项目,并且在更新模型时注意到,即使模型没有任何更改,我仍将同一模型保存回数据库中。

我为避免这种情况的想法如下:

$model = Model::find($id);
$model->fill([
    "name" => $request->name,
    ...
]);
if($model->isDirty){
    $model->save()
}

问题是,即使我不更改模型中的值,我仍要输入if()条件并保存模型。我尝试使用临时变量并调试了$model->getChanges(),但得到了一个空数组。

这是预期的行为吗?

1 个答案:

答案 0 :(得分:1)

有区别。

相关代码: https://github.com/laravel/framework/blob/6.x/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php#L1060

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。因此,实际上,在这种情况下,该模型已更改。