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エラーは回避される。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください