LaravelにてEloquentのfindとfirstOrFailにハマったけど、解決した話


はじめに

以下のような使い方をしてしまい、想定した結果にならずハマりました

// $idには1が入っている
$user = User::find($id)->firstOrFail();

知ってしまった今、なんてこと無い話になりますが、未来の自分に向けて備忘録を残しておきます

Laravelのバージョン

$ php artisan -V
Laravel Framework 5.8.29

前提

  • 以下のモデルは作成済み
    • App/User.php

結論

// $idには1が入っている
$user = User::find($id)->firstOrFail();

上記のような使い方をすると、以下のように2回SQLが実行されていました

select * from users where id = 1;
select * from users limit 1;

そのため、変数には2回目のSQLの実行結果が入っており、想定した動作になっていませんでした

対策

以下の書き方であれば、同じ動きになるようです

その①

// $idには1が入っている
$user = User::findOrFail($id);

その② firstOrFailを使用する場合(where句のあとはOKでした)

// $idには1が入っている
$user = User::where('id', $id)->firstOrFail();

参考

Laravel 5.8 Eloquent:利用の開始