计算“save()”字段对哪些字段执行操作(如果有)(检测更改)



->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']

最新更新