Подтвердить что ты не робот

Обновление Laravel Eloquent только в случае внесения изменений

Есть ли способ обновить запись в Laravel, используя красноречивые модели, только если было внесено изменение в эту запись? Я не хочу, чтобы какой-либо пользователь запрашивал базу данных без уважительной причины снова и снова, просто нажав кнопку, чтобы сохранить изменения. У меня есть функция javascript, которая включает и отключает кнопку сохранения в соответствии с тем, изменилось ли что-то на странице, но я хотел бы знать, можно ли также выполнять эту функцию на стороне сервера. Я знаю, что могу сделать это сам (это означает: не обращаясь к внутренней функциональности фреймворка), просто проверяя, изменилась ли запись, но прежде чем делать это таким образом, я хотел бы знать, действительно ли модель красноречия Ларавела так что мне не нужно повторно изобретать колесо.

Так я использую для обновления записи:

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

Ответ 1

Вы уже это делаете!

save() проверяет, изменилось ли что-то в модели. Если он не выполнил db-запрос.

Здесь соответствующая часть кода в Illuminate\Database\Eloquent\[email protected]:

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
}

Ответ 2

Мне нравится добавлять этот метод, если вы используете форму редактирования, вы можете использовать этот код для сохранения изменений в вашей функции update(Request $request, $id):

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

помните, что вы должны называть свои входы одним и тем же именем столбца. Функция fill() выполнит всю работу за вас:)

Ответ 3

Вы можете использовать getChanges() в модели Eloquent даже после сохранения.