Есть ли способ обновить запись в 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
}
isDirty()
для этого. Смотрите обновленный ответ
Мне нравится добавлять этот метод, если вы используете форму редактирования, вы можете использовать этот код для сохранения изменений в вашей функции update(Request $request, $id)
:
$post = Post::find($id);
$post->fill($request->input())->save();
помните, что вы должны называть свои входы одним и тем же именем столбца. Функция fill()
выполнит всю работу за вас:)
fill
имени и о том, как массово передать ему запрос. Спасибо! Мне не нужно было передавать идентификатор, так как я обновляю, так что его уже есть $request->id
.
Вы можете использовать getChanges()
в модели Eloquent даже после сохранения.
dirty
флаг, который используется для определения того, действительно ли требуется обновление базы данных, и этот флаг устанавливается путем сравнения исходных значений столбцаfind
со значениями в точке, где вы выполняете сохранение.