この記事では、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()を使いましょう。
一括更新を行う際はfillableの設定が必須
完結なコードでデータ更新を行うことができますが、設定も必要になります。
fillableという、複数代入で複数のカラムを一度に更新する場合の設定になります。
この設定をしておかないとデータが更新されないようにLaravelのデフォルトでなっています。
fillableについての詳しい記事は以下記事で紹介しています。
fillableの必要性と使い方・注意点をまとめています。
返り値にも違いがある
これらのメソッドの返り値にも違いがあります。
以下記事で他の主要メソッドの返り値を整理しているので気になる方は参考にしてみてください。
save()とupdate()の違いを理解して使い分けよう
いかがだったでしょうか。
微妙な差ですが2つのメソッドにはこのような違いがあります。
どちらのメソッドを使用するかは処理を行う状況によって異なるので適切なメソッドを選択できるようになりたいと思います。
違いを知っているといざという時に迷わずメソッドを選択できます。
参考になれば幸いです。