LaravelでSQLSTATE[42S02] Table ‘database.table’ doesn’t exist:問題と解決策
SQLSTATE[42S02]のエラーは、Laravelのアプリケーションがデータベース内の特定のテーブルを探しているが、そのテーブルが存在しない場合に発生します。エラーメッセージには次のように表示されます。
SQLSTATE[42S02] Table ‘database.table’ doesn’t exist:


1. エラーの原因
SQLSTATE[42S02] は次のような可能性で発生すると考えられます。
- テーブルが存在しない: 指定されたテーブルがデータベースに存在しない場合にこのエラーが発生します。これは、テーブルが作成されていない、あるいは誤って削除された場合に起こり得ます。
- テーブル名の誤り: クエリで指定されたテーブル名が間違っている場合もこのエラーが発生します。スペルミスやテーブル名の大文字小文字の違いが原因となります。
- マイグレーションが実行されていない: Laravelのマイグレーションがまだ実行されていないため、テーブルが作成されていない場合もあります。

1.1. 解決策
このエラーを解決するためのステップは以下の通りです:
- テーブル名を確認する:
- データベース構造を確認し、使用しているテーブル名が正しいか確認します。
- テーブル名にスペルミスがないか、大文字小文字が正しいかをチェックします。
- マイグレーションを実行する:
- 必要なテーブルがまだ作成されていない場合、Laravelのマイグレーションを実行してテーブルを作成します。
- ターミナルで以下のコマンドを実行します。
php artisan migrate
- マイグレーションファイルを確認する:
- マイグレーションファイルが正しく設定されているかを確認します。
- テーブル作成のためのスキーマが正しく記述されているかをチェックします。
1.2. 例外処理
エラーをハンドリングするために、try-catchブロックを使用して例外処理を行うことも検討できます。例えば:
try {
// クエリの実行
$users = DB::table('users')->get();
} catch (\\\\Illuminate\\\\Database\\\\QueryException $e) {
// エラー処理
echo 'Error: ' . $e->getMessage();
}
このようにすることで、エラーが発生した際にカスタムメッセージを表示したり、ログを記録したりすることができます。
1.3. 注意点
- データベース接続の確認: データベース接続設定が正しいか確認します。
.env
ファイルで設定を確認し、必要に応じて修正します。 - キャッシュのクリア: Laravelのキャッシュが問題の原因となる場合があるため、キャッシュをクリアすることも考慮します。
php artisan cache:clear php artisan config:clear
これらのステップを踏むことで、エラーの原因を特定し、解決することができるでしょう。


2. エラーの検証と修正
`SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘exp.users’ doesn’t exist` というエラーを実際に発生させ、その修正方法について解説します。
2.1. 検証環境
- PHP 8.1.25
- Laravel 10.48.12
- Windows 11
2.2. プロジェクトの作成
まず、エラー検証を行うためのサンプルプロジェクトを作成します。
composer create-project laravel/laravel SampleProject
2.3. コントローラーの作成
次に、`Users` テーブルに登録されているユーザー数をカウントするコントローラーを作成します。ここでは、例として `SampleController` を作成します。
php artisan make:controller SampleController
作成したコントローラーに以下のメソッドを追加します。
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
class SampleController extends Controller
{
public function index(){
$count = User::count();
return response($count);
}
}
このコードは、User テーブルのレコード数を取得してレスポンスとして返すプログラムです。
2.4. ルーティング
次に、ルーティングを設定します。`web.php` ファイルで以下のようにルーティングを追加してください。
use App\Http\Controllers\SampleController;
Route::get('/', [SampleController::class, 'index']);
この設定により、ブラウザで http://127.0.0.1:8000/
にアクセスすると、SampleController の index メソッドが実行されます。
2.5. エラーの発生と検証
まず、ターミナルで以下のコマンドを実行します。
php artisan serve
次に、ブラウザで http://127.0.0.1:8000/
にアクセスします。すると、”SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘exp.users’ doesn’t exist” というエラーが発生します。
このエラーは、users
テーブルが存在しないために発生します。Laravelでは、ユーザー認証機能がデフォルトで用意されており、users
テーブルのマイグレーションファイルが最初から含まれています。このファイルは、プロジェクトを作成すると database/migrations
ディレクトリに保存されます。
ターミナルで以下のコマンドを実行して、マイグレーションを実行します。
php artisan migrate
これにより、users
テーブルがデータベースに作成されます。
再度 http://127.0.0.1:8000/
にアクセスして、エラーが解消されたことを確認します。
ということで、何もしていないので登録数が0として表示されました。
2.6. ユーザー数のカウント
0人だと面白味がないと思うのでランダムにデータを作成してカウントしてみたいと思います。
以下の手順に従って、`users` テーブルにランダムに100人のユーザーをシーダーで追加する方法を説明します。
2.7. シーダーの作成
まず、Laravelのシーダーを作成します。ターミナルで以下のコマンドを実行します。
php artisan make:seeder UsersTableSeeder
次に、作成されたシーダーファイル(`database/seeders/UsersTableSeeder.php`)を開き、以下のように編集します。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Faker\Factory as Faker;
class UsersTableSeeder extends Seeder
{
public function run()
{
$faker = Faker::create();
foreach (range(1, 100) as $index) {
DB::table('users')->insert([
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => bcrypt('password'), // password
'remember_token' => Str::random(10),
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
2.8. シーダーの実行
次に、`DatabaseSeeder` ファイル(`database/seeders/DatabaseSeeder.php`)を編集して、`UsersTableSeeder` を呼び出すようにします。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call(UsersTableSeeder::class);
}
}
最後に、ターミナルで以下のコマンドを実行してシーダーを実行します。
php artisan db:seed
これで、`users` テーブルにランダムな100人のユーザーが追加されます。再度 http://127.0.0.1:8000/
にアクセスして、データが挿入されていることを確認できました。

