如果对该记录进行了更改,是否有任何方法可以使用雄辩模型更新Laravel中的记录?我不希望任何用户一遍又一遍地请求数据库没有正当理由,只需按下按钮即可保存更改。我有一个javascript
函数,可根据页面中是否有更改来启用和禁用保存按钮,但我想知道是否可以确保在服务器端执行此类功能。我知道我可以自己完成它(意思是:没有吸引框架的内部功能)只是通过检查记录是否有变化,但在这样做之前,我想知道Laravel雄辩的模型是否已经处理好了那,所以我不需要重新发明轮子。
这是我用来更新记录的方式:
$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();
答案 0 :(得分:126)
你已经在做了!
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
}
答案 1 :(得分:10)
我想添加此方法,如果您使用的是编辑表单,则可以使用此代码保存update(Request $request, $id)
函数中的更改:
$post = Post::find($id);
$post->fill($request->input())->save();
请记住,您必须使用相同的列名称命名输入。 fill()
函数将为您完成所有工作:)
答案 2 :(得分:3)
即使持久存在,也可以在口才模型上使用getChanges()
。