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 ответов:
ты уже это делаешь!
save()проверит, если что-то в модели изменилось. Если это не так, он не будет выполнять запрос к БД.вот соответствующая часть кода
Illuminate\Database\Eloquent\Model@performUpdate: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()функция сделает всю работу за вас:)
Comments