LaravelのEloquentメソッドsave()とupdate()の違いについて

※当サイトは、アフィリエイト広告を利用しています
Laravel
スポンサーリンク

この記事では、LaravelのEloquentメソッドであるsave()update()について違いを紹介しています。

どちらのメソッドもデータを保存するメソッドですが微妙に動きが異なります。

違いを理解することで適切なメソッドを書くことができるのでぜひ参考にしてみてください。

この記事を読むメリット

  • save()とupdate()の違いが理解できる
スポンサーリンク

Laravelのsave()とupdate()の違い

では早速違いについて紹介していきます。

大きな違いは大きく2つあると思っています。

  • データ更新時に既存データと更新データの差分を確認するか
  • 一括更新が可能か

この2つの違いについて、次章から詳しく解説していきます。

スポンサーリンク

save()とupdate()のデータ更新時の違い

まずは1つ目、「データ更新時に既存データと更新データの差分を確認するか」についてです。

save()とupdate()でデータ更新時のチェックが異なります。

どういうことか、実際のコードを使って解説します。

ユーザーの名前変更の処理を例にしてみます。

save()の場合

save()を使ってユーザーの名前を更新する場合は以下のようなコードになります。

public function updateUserName(User $user, Request $request)
{
   $user->name = $request->name;
   $user->save();
}

update()の場合

update()の場合は以下のようになります。

public function updateUserName(User $user, Request $request)
{
   $user->update([
         'name' => $request->name
      ]
   );
}

既存のデータと同じ場合に違いが生まれる

それぞれのデータ更新でどのような違いがあるのでしょうか。

違いが生まれるのは更新するデータに差分があるかどうかです。

先ほどの例だと、$requestで渡ってきたユーザー名「$request->name」を更新する処理でした。

save()では、「$request->name」が既存のデータと異なるかチェックをします。

チェックした結果、異なる場合のみに更新処理を行います。

同じだった場合は更新処理は行いません。

逆にupdate()は、そのようなチェックは行わず更新処理を行います。

つまり、既存のデータと同じデータが渡ってきたときに「save()は何もしない、update()はupdated_atが更新される」ということです。

エンジニアにおすすめ書籍

エンジニアになりたて、これから勉強を深めていきたいという方におすすめの書籍はこちら!

一括更新が可能か

続いての違い「一括更新が可能か」という点です。

save()では1件ずつでしか更新・保存処理ができません。

しかし、update()は複数のレコードに対して一括で更新・保存処理ができます。

public function updateUserName()
{
User::where('id', '>', 0)->update(['name' => 'Updated Name']);

// 省略
}

このように、idが1以上のレコードのname属性を一括して「Updated Name」に変更することができます。

save()を使って複数レコードを更新するにはforeachなど使って処理する必要があります。

save()は新規レコードを追加するメソッドなので一括更新などはできないのかなと思いました。

一括更新する際はupate()を使いましょう。

返り値にも違いがある

これらのメソッドの返り値にも違いがあります。

以下記事で他の主要メソッドの返り値を整理しているので気になる方は参考にしてみてください。

save()とupdate()の違いを理解して使い分けよう

いかがだったでしょうか。

微妙な差ですが2つのメソッドにはこのような違いがあります。

どちらのメソッドを使用するかは処理を行う状況によって異なるので適切なメソッドを選択できるようになりたいと思います。

違いを知っているといざという時に迷わずメソッドを選択できます。

参考になれば幸いです。

Laravel
シェアする
エンせいをフォローする
スポンサーリンク
タイトルとURLをコピーしました