エラーの原因
色々なケースでこのエラーは起こり得ますが、Laravelでこのエラーが出た時に多いパターンのひとつに「Soft Delete = 論理削除したデータ」を取ってこようとしてnullを取ってきてしまい、エラーになっているというものがあります。
// 実際のコード
// Productモデルにはソフトデリートが定義されている
namespace App\Models;
use Illuminate\Database\Eloquent\SoftDeletes;
class Product extends Model
{
use SoftDeletes;
}
// 加えてproductsテーブルにはdeleted_atのカラムに値が入っている
// id=1 のプロダクトが論理削除されている場合
// コントローラなどで該当のデータを取って来ようとすると...
$product = Product::find(1);
$product->name;
// 実行結果
ErrorException
Creating default object from empty value
つまり $product->name
や大元の $product
がnullになっているのに、それらに対して何かしらの操作をしようとして上記のエラーになる場合があります。
ということでDBからデータを引っ張ってくる時は、
- 該当のテーブルは論理削除を設定していないか?
- 該当のデータが論理削除されていないか?
を確認してみて下さい。
論理削除
テーブルにdeleted_at
というカラムを持たせ、ここに日時が入ってるレコードは削除されたものとみなす。違う名前で削除フラグ
のようなカラムを持たせる場合もあるが、Laravelのデフォルトではdeleted_at
のカラムがその役割を担う。
このようなカラムがなく、データベースから完全にデータを削除する場合は物理削除
と表現する。
(ご存知とは思いますが念の為。)
対策
このようなエラーを回避するには「論理削除のデータも含めて取得する」という操作が必要なので下記のように記載すれば大丈夫です。
$product = Product::withTrashed()->find(1);
データにアクセスする際 withTrashed()
を一緒に書けば、論理削除されたデータも検索して引っ張ってきてくれ、ErrorException : Creating default object from empty value
というエラーにはなりません。
参考URL
【Laravel5.8】Creating default object from empty valueを解決したい
stdClassをnewしたらPHP Warning: Creating default object from empty value inとなったときの対応方法
PHP Warning: Creating default object from empty valueの原因と対応
【php】 Creating default object from empty value