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として取得します。

上記だと佐藤さんの部署名は、外部結合のレコードがないので、$member->organがNULLになり、->nameの結果がエラーです。

そこで、ヘルパ関数のoptional()を使います。

ヘルパ関数で、optional($member->organ)->nameとして、$member->organを囲んであげます。
optional()は、囲まれた中のオブジェクトが真の場合は、オブジェクトを返してきます。

要するに、optional()で囲んでおけば、オブジェクトが偽(NULL)なら、->nameのオブジェクトを実行しないで抜けてくれます。

Eloquent, Laravel

Posted by nanaki