Есть ли способ обновить запись в Laravel, используя красноречивые модели, только если в эту запись было внесено изменение? Я не хочу, чтобы какой-либо пользователь снова и снова запрашивал базу данных без уважительной причины, просто нажимая кнопку, чтобы сохранить изменения. У меня есть javascript
функция, которая включает и отключает кнопку сохранения в зависимости от того, изменилось ли что-то на странице, но я хотел бы знать, можно ли сделать такую функцию и на стороне сервера. Я знаю, что могу сделать это сам (то есть: не обращаясь к внутренней функциональности фреймворка), просто проверив, есть ли изменения в записи, но прежде чем делать это таким образом, я хотел бы знать, заботится ли уже о красноречивой модели Laravel это, поэтому мне не нужно заново изобретать колесо.
Вот как я использую для обновления записи:
$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();
dirty
флаг, который используется для определения, действительно ли требуется обновление базы данных, и этот флаг устанавливается путем сравнения исходныхfind
значений столбцов со значениями в точке, где вы выполняете сохранениеОтветы:
Вы уже это делаете!
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; }
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 }
источник
isDirty()
для этого. См. Обновленный ответisDirty()
.getChanges()
метод. Проверьте мой ответ stackoverflow.com/a/54132163/1090395isDirty()
будет,true
если вы не укажете свои атрибуты правильно. У меня было число с плавающей запятой, которое было точно таким же, как в базе данных, однако, поскольку я устанавливал число с плавающей запятой со строкой (например, «10,50» вместо 10,50), он обнаруживал бы его как изменение и выполнял обновление.Вы можете использовать
getChanges()
модель Eloquent даже после сохранения.источник
Мне нравится добавлять этот метод, если вы используете форму редактирования, вы можете использовать этот код для сохранения изменений в вашей
update(Request $request, $id)
функции:имейте в виду, что вы должны называть свои поля ввода одним и тем же именем столбца.
fill()
Функция будет делать всю работу за вас :)источник
fill
и о том , как массово передать ему запрос. Благодарность! Мне не нужно было передавать идентификатор, так как я обновляю, так что он уже там$request->id
.