Сохранить до обновления в 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