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

この記事では、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()は新規レコードを追加するメソッドなので一括更新などはできないのかなと思いました。

複数レコードを一括更新する場合は、update() を使いましょう。

一括更新を行う際はfillableの設定が必須

簡潔なコードでデータ更新ができますが、事前に設定が必要です。

fillableという、複数代入で複数のカラムを一度に更新する場合の設定になります。

この設定をしていない場合、Laravel のデフォルト仕様によりデータは更新されません。

fillableについての詳しい記事は以下記事で紹介しています。

fillableの必要性と使い方・注意点をまとめています。

返り値にも違いがある

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

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

https://gyas.co.jp/knowledge_blog/laravel-eloquent-return/

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

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

細かな違いではありますが、2つのメソッドには明確な差があります。

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

違いを把握しておくことで、実装時に迷わずメソッドを選択できるようになります。

参考になれば嬉しいです。

Recruit

Contact