Обновление 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(); 

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

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

Вот соответствующая часть кода в 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 } 

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

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

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