Call to undefined method StdClass::save()


Laravelで記事を更新する処理(update)を書いている際に起こったエラーです。原因は単純なことだったのですが、エラー解消に2日ほど時間がかかってしまったので共有したいと思いました。

 環境


・PC: Macbook Pro 2017
・Laravel 5.8
・PHP 7.4.15
・Mysql 5.7.34

  原因

更新したい記事を取得する際にEloquentで取得したレコードとクエリビルダで取得したレコードの型が違うことが原因でした。
色々な方の記事を参考にしてアップデートの処理を書いていたため、上記のことを理解しておらずハマりました。

Eloquent

$rsv = Book::where('user_id','=',$user)
        ->orderBy('created_at','desc')
        ->first();

Eloquentで返すレコード(object(Illuminate\Support\Collection)

クエリビルダ

$rsv = DB::table('books')
        ->where('user_id','=',$user)
        ->orderBy('created_at','desc')
        ->first();

クエリビルダで返すレコード(array(n) { [0]=> object(stdClass)

僕の場合はEloquentで処理を書いていたので、クエリビルダではなくEloquentのモデルを使ってデータを取得しなければならなかったということです。

お役に立てたら嬉しいです。

 参考にさせて頂いた記事

・Eloquentとクエリビルダ返す値の違い
・Laravel Eloquent