Laravel: ModelNotFoundException
LaravelでEloquentモデルが見つからない場合のエラー原因と解決策
概要
LaravelでfindOrFail()やfirstOrFail()でモデルが見つからなかった際に発生するエラーです。
エラーメッセージ
``` Illuminate\Database\Eloquent\ModelNotFoundException: No query results for model [App\Models\User] 1 ```
原因
- レコードが存在しない: 指定IDのレコードがDB上にない
- ソフトデリート: 論理削除されたレコード
- クエリ条件の誤り: WHERE句でレコードが絞られた
- テーブル名の不一致: モデルとテーブルの紐付けミス
解決策
1. findOrFailの代わりにfindを使用
```php // 例外を投げる $user = User::findOrFail($id);
// nullを返す(安全) $user = User::find($id); if (!$user) { return response()->json([’error’ => ‘User not found’], 404); } ```
2. カスタム404レスポンス
```php // app/Exceptions/Handler.php public function render($request, Throwable $e) { if ($e instanceof ModelNotFoundException) { return response()->json([ ’error’ => ‘Resource not found’, ‘model’ => class_basename($e->getModel()) ], 404); } return parent::render($request, $e); } ```
3. ソフトデリートを含めて検索
```php // 削除済みも含める $user = User::withTrashed()->findOrFail($id);
// 削除済みのみ $user = User::onlyTrashed()->findOrFail($id); ```
4. Route Model Bindingのカスタマイズ
```php // ルート定義 Route::get(’/users/{user}’, [UserController::class, ‘show’]);
// モデルでカスタムキー class User extends Model { public function getRouteKeyName() { return ‘uuid’; } }
// コントローラー public function show(User $user) { return $user; // 見つからない場合は自動で404 } ```
5. 存在確認してから処理
```php if (User::where(‘id’, $id)->exists()) { $user = User::find($id); // 処理 } ```
よくある間違い
- APIで500エラーを返してしまう(404が適切)
- ソフトデリートの存在を忘れる
- キャッシュされた古いIDを参照
関連エラー
関連エラー
PHP の他のエラー
この記事は役に立ちましたか?