Edited at

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

More than 3 years have passed since last update.

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: