Laravel:Trying to get property of non-object エラー

Laravel:Trying to get property of non-object エラー

エラー:Trying to get property of non-object

商品情報等を扱うと片方にはデータがあってもう片方にはないなんて事がざらにあります。

Eloquantでリレーションを書いてリレーション先の値を呼び出したいとき、Laravelのアロー演算子は等便利です。

こんな感じでViewに書くだけで値を取ってくるんですから直打ちPHPと比べて判り易さも書きやすさも段違いです。

そう思っていた矢先の事です。

Table:itemsに無い商品のサイズを先にTable:itemsizesに記載した時、事件は起こりました。

発生原因は明白です。

アロー演算子の先に値が無い

はい、理解してます。でもね、メーカーからカタログ来てサイズ入れたい商品のサイズ入れて『ついでに』って事もある訳ですよ。順序を守った方が整合性を取り易い事は理解してますが、効率を考えた時、先に登録してしまう事もあります。

リレーション先に値が無い時NULLして欲しい

そうなんです。リレーションの先が無かった時にNull返してくれればいいんです。

そんな関数があったので備忘録として記します。

optional($item->itemsize)->sizeで解決

Laravelさんはいろいろ便利なやつがありますね。

ヘルパー関数optional()は第二因数と共に利用し、第一因数(optionalの中)がNullでない時、第二因数を実行するそうです。

ヤバい、超便利かもしれない。

これで先に商品サイズを書いてもnon-objectエラーが出ないで済む!

ありがとう、optional()!

まとめ

CSVなどで一気に更新/追加したい1対多リレーションのテーブルがある時、更新エラーが生じてもnon-objectエラーを出さない為には次の関数が必要。

  • optional($hoge->hage)->hege

これでhagesテーブルだけアイテム追加してしまってもnon-objectエラーは回避される。