【Laravel】optionalヘルパー関数でErrorException : Trying to get property of non-objectを防止する

Laravel

Laravelで遭遇しやすいエラーの一つに、ErrorException : Trying to get property of non-objectがあります。

今回はErrorException : Trying to get property of non-objectが起こらないようにするための対策方法を紹介します。

スポンサー

optionalヘルパー関数

ErrorException : Trying to get property of non-objectが発生する状況とはどのようなものでしょうか?

LaravelでEloquentを使用していると、モデルのリレーションを頻繁に書く機会があります。

その際、アローでチェーンすることがありますが、下記の例ではcommentがnullの場合、プロパティが存在しないため、ErrorExceptionが発生します。


$user_id = $post->user->id;

こうした状況で発生するErrorExceptionの回避策として、ヘルパー関数のoptional()を使用することができます。

optional()は下記のように使用します。


$user_id = optional($post->user)->id;

$post->userがオブジェクトの場合はidを返却し、$post->userがオブジェクトでない場合、上記はnullを返却します。

optional()は第2引数にクロージャーを設定することが可能で、第1引数の結果がnullではない場合に、クロージャーの処理を実行します。

クロージャーの引数には第1引数の結果が渡されます。


$user = optional(Post::find($post_id), function ($post) {
    return User::find($post->id);
});