Laravelでコントローラーからデータベースに対してクエリ(検索文)を書く際、便利なクエリに、find()というのがあります。
クエリにModel名::find($id);のように書く事で、
$idの値が79なら、データベースのID79の行データを取り出してくれます。
ただ、人によっては、find(); とだけ書く人もいれば、findOrFail(); と書く人もいます。
この2つの違いについて解説します。
Laravelのfind()とfindOrFail()の違い、使い分け方。
find()とfindOrFail()の違いですが、
- find()は、一致するidが見つからなかった場合は、nullを返します。
- findOrFail()は、一致するidが見つからなかった場合は、エラーを返します。
そんな事言われても、実際にサイト作成の際にどんな影響が出るのか分からないですよね?というわけで、実際、エラーがどう変わるのか見てみましょう。
find()とfindOrFail()のエラー画面の違い
find()を使った際、idが見つからずエラーになった場合↓
ErrorException
Trying to get property 'created_at' of non-object (View: D:\XAMPP\htdocs\newsite\resources\views\show.blade.php)
こういうエラー画面が出ました。
対して、findOrFail()を使って、idが見つからずエラーになった場合は、
404 | Not Found が返されました。
find()とfindOrFail()どっちを使うべきか?
これを考えると、サイトを開発中はfind()を使った方が、詳細なエラー画面が出てくれた方が、どこがエラーを出してるのか見つけやすいというメリットがあるわけですが、
今のエラー画面を見直してみると・・
コントローラーでid番号を探すクエリを出したのに、エラー画面では、ブレードで読み出し指定した{{ $data->created_at }}部分でエラーってるよと出てしまいます。
そう全然違う場所にエラーを出してるので、このエラー画面を見て、いくらブレードにエラーがないか探しても、エラー原因は見つかる事はありません・・これ逆効果ですよね(汗)?
逆に、findOrFail()を使った場合は、404 | Not Found と出ます。詳細なエラー原因は出ませんが、Not found(そんなidのURLは見つからない)と出てくれた方が、分かりやすいですよね。ああ単純にそんなID番号がデータベースにはなかったのねと。
さらに、実際にサイトをウェブ上に公開した場合は、お客さんにエラー画面を見せたくはないですよね?
なので、404 | Not Foundと出てくれた方がありがたい。
ただ、これに関しては、仮にfind()を使ってても、.envファイルを開いて、APP_DEBUGをtrueからfalseに書き換えれば、同じように、404 | Not Foundが表示されるようになります。
最初から、404 | Not Found を表示したい場合はfindOrFail()を使い、普通にエラー画面を表示したいのであれば、find()を使う方が良いでしょう。
もし「find()でnullが出たら〇〇する」のような、if文、条件分岐を続けて使うのであれば、find()を使った方が、条件分岐を書きやすいでしょう。
似たもので、first() と firstOrFail() っていうのもありますが、同じです。見つからなかった時に、nullかエラーか、どっちを出したいかで使い分けます。