質問: こんにちは、laravlの勉強をしています。 先日下記の質問をさせていただきました。 フォームの値をリレーション先のテーブル値の編集 上記の疑問は解決したのですが、 今度はまた新たな疑問が出てきました。 先日質問した内容はリレーション先のテーブル値の編集でしたが、 今度はリレーション先のテーブル値の取得についてです。 ``` 名前 {{ $user->name }} # 値がなくても問題なく画面が表示される 自己PR {{ $user->user_detail_profile->user_strength }} # 値がないとエラー画面へ ``` bladeファイルで、Userモデルの値と、Userモデルに紐づいたUserProfileの値を出力しようとしています。 Userモデルの値は値の存在チェックをしなくてもエラーは出ませんが、 UserProfileモデルの値については存在チェックをしなければ、エラー画面が表示されてしまいます。 率直にこの差はなんだろうということです。 一応下記のように値チェックをすれば、エラー画面表示は回避できるのですが、 フォーム項目が多い場に都度チェックするのは、あまりスマートな書き方ではない気がします。 ``` 自己PR @if(isset($user->user_detail_profile)) {{ $user->user_detail_profile->user_strength }} @else @endif ``` この場合、みなさまどのように書いていますでしょうか。 ご教授いただければと思います。 追記 -- crhgさん、kawaxさん 早速の回答誠にありがとうございます。 optional()でもkawaxさんに最初にご提案いただいた下記の方法でも上手くいけました。 ``` {{ $user->user_detail_profile->user_strength ?? '' }} ``` 少し調べてみたところ、どうやら値がnullかどうかではなく、 リレーション先のテーブルにレコードがない場合に同様のエラーが出ているようでした。 (値がnullでもレコードがあればエラー画面は表示されませんでした) ちなみに別アプローチで、Userモデルに新しくレコードを追加した際に、 UserProfileモデルに自動で値を追加する方法などはLaravelで用意されてたりしますか?
回答: `$user->user_detail_profile`が`null`だと`$user->user_detail_profile->user_strength`は`null`にたいして`user_strength`プロパティを読み出そうとしているのでエラーになってしまいます。 Laravelにはこういう場合に便利な`optional()`というヘルパが用意されています。 > > optional関数はどんな引数も指定でき、そのオブジェクトのプロパティへアクセスするか、メソッドを呼び出せます。指定したオブジェクトがnullだった場合、エラーを発生させる代わりに、プロパティとメソッドはnullを返します。 > > > これを使って以下のようにするとよいでしょう。 ``` {{ optional($user->user_detail_profile)->user_strength }} ```