Есть ли способ обновить запись в 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()
выполнит всю работу за вас 🙂