做->save()
并且只有在进行更改时才更新->update()
,我认为这是真的吗?
以下是IlluminateDatabaseEloquentModel@performUpdate
中代码的相关部分:
protected function performUpdate(Builder $query, array $options = [])
{
$dirty = $this->getDirty();
if (count($dirty) > 0)
{
// runs update query
}
return true;
}
我通常这样更新:
public function update(RequestsUpdatePetRequest $request, Pet $pet)
{
$pet->update($request->all());
return $pet;
}
我想从->save
和->update
中找出是否更新了哪些字段名称?以及什么是旧值和新值。
我目前手动这样做:
public function update(RequestsUpdatePetRequest $request, Pet $pet)
{
$changes = [];
if ($request->exists('name') && $request->name != $pet->name) {
$changes['name'] = array([
'old' => $pet->name,
'new' => $request->name
]);
}
if ($request->exists('avatar') && $request->avatar != $pet->avatar) {
$changes['avatar'] = array([
'old' => $pet->avatar,
'new' => $request->avatar
]);
}
if (!count($changes)) {
return response()->json(['error'=>'No properties changed'], 422);
}
$pet->update($request->all());
$body = json_encode($changes);
$message = new Message(['body' => $body, 'kind' => 'PET_UPDATE']);
}
有没有自动化的方法可以做到这一点?
你不能用 update()
这样做,但你可以在save()
之前使用 getDirty()
:
$model = Model::find($id);
$model->fill($request->all());
$cahnges = $model->getDirty();
$model->save();
getDirty()
将仅返回一个包含已更改列的数组,例如:
['name' => 'New Name', 'address' => 'New Street, 12']