Laravel雄辩地更新,只要有改变
有没有什么办法可以在Laravel使用雄辩的模型更新logging,只要对logging进行了更改? 我不希望任何用户请求数据库一遍又一遍,只是按下button来保存更改。 我有一个javascript
function,启用和禁用保存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()
函数将为你做所有的工作:)