Сохранить до обновления в laravel
В чем разница между методами save() и update() в Laravel.
Я использовал метод save() в случае запроса на обновление, но в некоторых случаях он действует как обновление, и в немногих случаях он действует как функция запроса вставки. Пожалуйста, дайте мне знать, какая именно разница между ними.
Ответы
Ответ 1
save(): вы можете рассматривать его как эквивалент INSERT в SQL, он создаст новую модель (и вставит ее в базу данных)
Чтобы создать новую запись в базе данных, создайте новый экземпляр модели, установите атрибуты для модели, затем вызовите метод сохранения
update(): вы можете рассматривать его как эквивалент UPDATE в sql, он создаст новую модель (и вставит ее в базу данных)
Метод сохранения также можно использовать для обновления моделей, которые уже существуют в базе данных. Чтобы обновить модель, вы должны извлечь ее, установить любые атрибуты, которые вы хотите обновить, а затем вызвать метод сохранения. Опять же, timestamp updated_at будет автоматически обновлена, поэтому нет необходимости вручную устанавливать ее значение
код
$flight = App\Flight::find(1);
if (empty($flight)) {// you can do this condition to check if is empty
$flight= new Flight;//then create new object
}
$flight->name = 'New Flight Name';
$flight->save(); //this will UPDATE the record with id=1
для более подробной информации документ
Ответ 2
Эти методы позволяют вам сохранять данные в базе данных.
Метод save()
perfroms как INSERT
при создании новой модели, которая в настоящее время не представлена в вашей таблице базы данных:
$flight = new Flight;
$flight->name = $request->name;
$flight->save(); // it will INSERT a new record
Также он может действовать как UPDATE
, когда ваша модель уже существует в базе данных. Таким образом, вы можете получить модель, изменить некоторые свойства, а затем save()
ее, фактически выполнив db UDPATE
:
$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save(); //this will UPDATE the record with id=1
Метод update()
позволяет вам обновлять свои модели более удобным способом:
App\Flight::where('active', 1)
->where('destination', 'San Diego')
->update(['delayed' => 1]); // this will also update the record
Таким образом, вы даже не должны назначать полученную модель для любой переменной. Обновленные свойства передаются в качестве аргументов.
Примеры и дополнительная информация в Laravel docs.
Ответ 3
Осталось только одно, о чем @ginopane рассказывал о различии, и что если вы используете метод обновления на query builder result
, то laravel игнорирует массив $fillable
или $guard
вашей модели. Это особенно важно, если вы хотите использовать Input::all()
в качестве аргумента для обновления:
Post::where('id', $id)->update(Input::all());
Итак, в этом случае, если вы используете App\Flight::where('active', 1)->update(Input::all());
, все в вашей базе данных будет обновлено, даже если вы поместите его в $fillable
. Поэтому не забудьте использовать методы save
и update
на Eloquent instance
, а не Query builder one. Следующий код будет хорош, даже если пользователь отправляет поля, которые вы не хотите вставлять или обновлять в своей таблице данных:
// User model
protected $fillable = ['email', 'name'];
// controller
public function update($id)
{
$user = User::findOrFail($id);
// validate the input here, use Request to do the job or whatever you like
$user->update(Input::all());
return view('some_view')->with('notice', 'user updated');
}
Теперь, несмотря на то, что при передаче FORM здесь будут обновляться только теги name
и email
.
Надеюсь, что этот полный ответ @ginopane