Trying to get property ‘id’ of non-object () リレーションでのエラー解決
1 |
Trying to get property 'id' of non-object () |
Laravelで1対多のリレーションをした場合に、いわゆる外部結合で「一致しない」レコードがあると値はNULLになります。
その場合に、上記のエラーが発生します。
社員テーブル $member
ID | 名前 | 部署ID |
1 | 山田 | 1 |
2 | 鈴木 | 2 |
3 | 佐藤 | 3 |
部署テーブル $organ
ID | 部署名 |
1 | 営業部 |
2 | 総務部 |
リレーションした結果(だいぶ省略)
ID | 名前 | 部署ID | 部署名 |
1 | 山田 | 1 | 営業部 |
2 | 鈴木 | 2 | 総務部 |
3 | 佐藤 | 3 | NULL |
ヘルパ関数 optional() で解決
リレーションしているから、部署名を$member->organ->nameとして取得します。
1 2 3 4 5 6 7 |
// belongsToでリレーションしてある前提 @foreach($members as $member) <div>{{$member->organ->name}}</div> @endforeach |
上記だと佐藤さんの部署名は、外部結合のレコードがないので、$member->organがNULLになり、->nameの結果がエラーです。
そこで、ヘルパ関数のoptional()を使います。
1 2 3 4 5 6 7 |
// belongsToでリレーションしてある前提 @foreach($members as $member) <div>{{optional($member->organ)->name}}</div> @endforeach |
ヘルパ関数で、optional($member->organ)->nameとして、$member->organを囲んであげます。
optional()は、囲まれた中のオブジェクトが真の場合は、オブジェクトを返してきます。
要するに、optional()で囲んでおけば、オブジェクトが偽(NULL)なら、->nameのオブジェクトを実行しないで抜けてくれます。