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