クマのブログ

つまづいたところ、学びを書いていきます

update/save, create/makeの違い

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/

ありがとうございます。