【Laravel】findOrFailを主キー以外でやるにはどうすればいい?

どーも!

たかぽんです!

今回はLaraveldefindOrFailというメソッドがあるんですが、ふと、主キー以外のユニークな値でやりたいんだけど、どうすればいいんだろ...?

と思ったので、調べてみました!

findOrFailを主キー以外でやるにはどうすればいい?

さて、それではやっていきます!

そもそもfindOrFailというメソッドは以下のBuilderのAPIですね。

上記ページには以下のように書かれています。

Find a model by its primary key or throw an exception.

簡単に言うと..."主キーでモデルを探すか、例外を返し"ます。

普通のfindでもモデルを探すことはできますが、例外処理を書いておいた方がエラーハンドリングをしっかりできるので、大抵はこちらのメソッドを使った方がいいでしょう。

そして、今回やりたいのは...

この"主キーではなく別のカラムで"モデルを探したかったわけです。

findOrFailのメソッドで引数増やしたりしたらできるかなぁ〜?と思っていたんですが、どうやらできなさそうです。

ただ、別の方法でできたので、そちらをご紹介します。

firstOrFailを使用して主キー以外の値でFindOrFailを実現する

さて、それではいきなり結論ですが...!

"firstOrFail"というメソッドと"where"を組み合わせることで実現できます!

実は公式ページにも書いてあったりするんですが...

詳しくみていきますね!

まず、普通のfindOrFailだと以下のようになります。


$model = App\Hoge::findOrFail(1);

これで、Hogeモデルの主キーの値が引数に渡された"1"であるモデルを取得することができます。

ところが、主キーではない値で探したい場合はこの方法では実現できません。

そこで、仮に別に"other_id"というカラムがあった場合、その値で探すとします。

その場合...

$model = App\Hoge::where('other_id', 1)->firstOrFail();

上記のように記載することで、other_idが1のモデルが存在しない場合は404のexceptionが返されるわけですね!

whereと、firstOrFailを組み合わせて使えば実現できるのは初知りでした...

ただ、一点気をつけて欲しいのが、findOrFailメソッドでは主キーの値を取得するので、取得されるモデルは常に一意に決まります。

しかしながら、whereだと複数のモデルが取得される可能性があり、このfisrstOrFailではその中から一番初めにヒットしたモデルが取得されます。

全く同じものとして使うと、バグの元になるので注意が必要です。

例えば...

whereで指定するキーの値がDB側でunique制約で制限してあげると、上記のような仕様ズレを気にしなくてもよくなりますね。

上記の仕様ズレだけ気をつけて使用するように気をつけてください。

また、本メソッドについては以下に解説もありますので、是非読んでみてください。

(以下の画面で "Not Found例外"で文字列検索をすると項目に飛べると思います)

まとめ

今回はFindOrFailメソッドについて調べてみました。

そういえば主キー以外でfindOrFailを実装したことないなぁ〜と思いましたが、firstOrFailは見かけたような...見かけなかったような...

今後はfindOrFailの変わりだけでなく、"where->first()"を使う場面でも本メソッドを積極的につかっていきたいですね!

それでわ!

おすすめの記事