Laravel красноречивое обновление только если были внесены изменения


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

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

$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();
2   51   2015-03-05 01:38:52

2 ответа:

ты уже это делаешь!

save() проверит, если что-то в модели изменилось. Если это не так, он не будет выполнять запрос к БД.

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

protected function performUpdate(Builder $query, array $options = [])
{
    $dirty = $this->getDirty();

    if (count($dirty) > 0)
    {
        // runs update query
    }

    return true;
}

The 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
}

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

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

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