Laravel Eloquent 更新,只要进行了更改

2022-08-30 07:27:16

有没有办法使用雄辩的模型在Laravel中更新记录,只要对该记录进行了更改?我不希望任何用户一遍又一遍地无缘无故地请求数据库,只需点击按钮即可保存更改。我有一个功能,可以根据页面中是否有变化来启用和禁用保存按钮,但我想知道是否有可能确保在服务器端也执行此类功能。我知道我可以通过检查记录是否有变化来自己完成它(意思是:不诉诸框架的内部功能),但是在这样做之前,我想知道Laravel雄辩的模型是否已经解决了这个问题,所以我不需要重新发明轮子。javascript

这是我用来更新记录的方式:

$product = Product::find($data["id"]);
$product->title = $data["title"];
$product->description = $data["description"];
$product->price = $data["price"];
//etc (string values were previously sanitized for xss attacks)
$product->save();

答案 1

你已经在这样做了!

save()将检查模型中的某些内容是否已更改。如果没有,则不会运行数据库查询。

以下是以下代码的相关部分:Illuminate\Database\Eloquent\Model@performUpdate

protected function performUpdate(Builder $query, array $options = [])
{
    $dirty = $this->getDirty();

    if (count($dirty) > 0)
    {
        // runs update query
    }

    return true;
}

该方法只是将当前属性与创建模型时保存的副本进行比较。这是在以下方法中完成的:getDirty()originalsyncOriginal()

public function __construct(array $attributes = array())
{
    $this->bootIfNotBooted();

    $this->syncOriginal();

    $this->fill($attributes);
}

public function syncOriginal()
{
    $this->original = $this->attributes;

    return $this;
}

如果您想检查模型是否脏,只需调用:isDirty()

if($product->isDirty()){
    // changes have been made
}

或者,如果要检查某个属性:

if($product->isDirty('price')){
    // price has changed
}

答案 2

即使在持久化之后,您也可以在雄辩模型上使用。在此处查看文档$product->getChanges()


推荐