Laravel:Trying to get property of non-object エラー
エラー:Trying to get property of non-object
商品情報等を扱うと片方にはデータがあってもう片方にはないなんて事がざらにあります。
Eloquantでリレーションを書いてリレーション先の値を呼び出したいとき、Laravelのアロー演算子は等便利です。
{{itemsize->item->name}}
こんな感じでViewに書くだけで値を取ってくるんですから直打ちPHPと比べて判り易さも書きやすさも段違いです。
そう思っていた矢先の事です。
Table:itemsに無い商品のサイズを先にTable:itemsizesに記載した時、事件は起こりました。
Trying to get property of non-object(View: /hogehoge/index.blade.php)
発生原因は明白です。
アロー演算子の先に値が無い
はい、理解してます。でもね、メーカーからカタログ来てサイズ入れたい商品のサイズ入れて『ついでに』って事もある訳ですよ。順序を守った方が整合性を取り易い事は理解してますが、効率を考えた時、先に登録してしまう事もあります。
リレーション先に値が無い時NULLして欲しい
そうなんです。リレーションの先が無かった時にNull返してくれればいいんです。
そんな関数があったので備忘録として記します。
optional($item->itemsize)->sizeで解決
Laravelさんはいろいろ便利なやつがありますね。
ヘルパー関数optional()は第二因数と共に利用し、第一因数(optionalの中)がNullでない時、第二因数を実行するそうです。
ヤバい、超便利かもしれない。
//ビューに
@foreach($items as $item)
{{optional($itemsize->item)->name}}
@endforeach
これで先に商品サイズを書いてもnon-objectエラーが出ないで済む!
ありがとう、optional()!
まとめ
CSVなどで一気に更新/追加したい1対多リレーションのテーブルがある時、更新エラーが生じてもnon-objectエラーを出さない為には次の関数が必要。
- optional($hoge->hage)->hege
これでhagesテーブルだけアイテム追加してしまってもnon-objectエラーは回避される。

