Laravel雄辩地更新,只要有改变

有没有什么办法可以在Laravel使用雄辩的模型更新logging,只要对logging进行了更改? 我不希望任何用户请求数据库一遍又一遍,只是按下button来保存更改。 我有一个javascriptfunction,启用和禁用保存button根据是否有什么改变了页面,但我想知道是否有可能确保在服务器端也做这种function。 我知道我可以通过检查logging是否有变化来自己完成(意思是:不要求框架的内部function),但在这样做之前,我想知道Laravel雄辩的模型是否已经处理所以我不需要重新发明轮子。

这是我用来更新logging的方式:

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

你已经在做了!

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()方法只是比较当前属性和创build模型时保存的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 } 

我喜欢添加这个方法,如果你正在使用一个编辑表单,你可以使用这个代码来保存update(Request $request, $id)函数中的变化:

 $post = Post::find($id); $post->fill($request->input())->save(); 

请记住,您必须使用相同的列名命名您的input。 fill()函数将为你做所有的工作:)