update/saveについて
update
差分を見ずにUPDATEのSQLを発行する
Customer::where('id', 1) ->update(['name' => $request->name]);
- ここで
$request->name
が既存のDBの内容と同じだった場合でもUPDATEのSQLが発行され、クエリが実行されることになる - updated_atがカラムにあれば現在時刻に更新する
save
差分を見てUPDATEのSQLを発行する
$customer = Customer::find(1) $customer->name = $request->name; $customer->save();
- ここで
$request->name
が既存のDBの内容と同じだった場合、差分がないことを検知しUPDATEのSQLは発行されず、クエリが実行されない - updated_atカラムも更新はされない
<補足>saveのお供「fill」
やっていることはモデルのプロパティの変更を一括で出来てしまう
public function create(UserControllerRequest $request) { $user = $this->user; $user->name = $request->name; $user->password = $request->password; $user->save(); }
例えば、こんなコードを
public function create(UserControllerRequest $request) { $this->user->fill($request->all())->save(); }
fillを使ってスッキリ書ける、というメリットがある。
saveとの相性がいいので、頻出する。
所感
余計なクエリを発行しなくていいので、updateよりもfill&saveが主流ではないかなと思いました。
※実際にアサインしているプロジェクトもfill, saveが主流
update/saveの参考記事
- saveとupdateの違い
https://tech1313.hatenablog.com/entry/2020/10/21/155947
- fillについて
https://zenn.dev/naonao70/articles/a8abba2b170c31
ありがとうございます。
create/makeについて
create
Model::create()
に該当。INSERTのSQLが発行され、クエリが実行される
インスタンスの作成 → 属性の代入 → データの保存を一気通貫
make
new Model()
に該当。INSERTのSQLは発行されない。
インスタンスの作成 → 属性の代入 まで実行
所感
要はDBに保存しているか、せずにモデルのインスタンス化だけしているかの違い
create/makeの参考記事
- createとmakeについて
https://qiita.com/nunulk/items/06370af1594a10faa749#eloquent-model-factory-とは
- 特にcreateについて
https://katsusand.dev/posts/laravel-save-data-db/
ありがとうございます。