259
189

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Eloquentのメソッド saveとupdateは処理が異なる

Last updated at Posted at 2016-05-27

Laravelでデータの保存をするときに使う
update()save()は処理が異なるので注意が必要

先に結論

  • update()は更新データとの差分を見てないで更新する :expressionless:
  • save()は更新データとの差分を見て更新するか決めてる :eyes:

どういうことだ

ちょっと例を添えて説明

下記2例のように
データを保存をすることがあるかと思う

update()を使った場合
App\Flight::where('id', 1)
          ->update(['name' => $request->name]);
save()を使った場合
$flight = App\Flight::find(1)
$flight->name = $request->name;
$flight->save();

この時、もし$request->nameが既存データと同じデータだとしたら

save()

updated_atのカラムが更新されない

update()

updated_atのカラムが更新される

そんな挙動になる/(^o^)\一緒じゃないのね

Eloquentのメソッドの中身を見てみるとわかる

vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.phpsave()を見てみると
すでにデータが存在している場合(つまりINSERTの処理の時)はperformUpdate()というメソッドが呼ばれている

そこで以下の処理

performUpdate()の中身
// 変更されたデータを取得
$dirty = $this->getDirty();
// 変更があったら挿入の処理をするよ
if (count($dirty) > 0) {
   ~~ここでデータ挿入の処理~~
}

こんな感じでsave()はデータの更新を行っているということでした。
ちなみにupdate()は何を判定することなく、そのままデータをガツンと入れてます。

気をつけよう :innocent:

259
189
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
259
189

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?