Laravel Eloquent 更新,如果已经进行了更改

新手上路,请多包涵

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

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

 $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();

原文由 user2755140 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 361
2 个回答

你已经在做!

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() 方法只是将当前属性与创建模型时保存在 original 中的副本进行比较。这是在 syncOriginal() 方法中完成的:

 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
}

原文由 lukasgeiter 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 Mladen Janjetovic 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题