MeWrite Docs

Laravel: ModelNotFoundException

LaravelでEloquentモデルが見つからない場合のエラー原因と解決策

概要

LaravelでfindOrFail()やfirstOrFail()でモデルが見つからなかった際に発生するエラーです。

エラーメッセージ

``` Illuminate\Database\Eloquent\ModelNotFoundException: No query results for model [App\Models\User] 1 ```

原因

  1. レコードが存在しない: 指定IDのレコードがDB上にない
  2. ソフトデリート: 論理削除されたレコード
  3. クエリ条件の誤り: WHERE句でレコードが絞られた
  4. テーブル名の不一致: モデルとテーブルの紐付けミス

解決策

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 の他のエラー

最終更新: 2025-12-10