PHPプログラミング

Laravelのマイグレーションで Cannot declare class TableNameのエラー

Laravelでマイグレーションしたときに Cannot declare class TableName, because the name is already in use のエラーに遭遇したのでメモっておきます。

スポンサーリンク

事象

新規にテーブルを作成しようとマイグレーションしたところ当該エラーになりました。

$ docker compose exec phpfpm php artisan --version
Laravel Framework 8.73.2
$
$ docker compose exec phpfpm php artisan migrate
PHP Fatal error:  Cannot declare class CreateDemo, because the name is already in use in /var/www/app/database/migrations/2022_05_21_000001_create_demohoge.php on line 0
[2022-05-21 13:04:45] local.ERROR: Cannot declare class CreateDemo, because the name is already in use {"exception":"[object] (Symfony\\Component\\ErrorHandler\\Error\\FatalError(code: 0): Cannot declare class CreateDemo, because the name is already in use at /var/www/app/database/migrations/2022_05_21_000001_create_demohoge.php:0)
...
$

エラーメッセージには、同名のクラスがすでに使用されていると出力されていますが、同名のクラスはどこにも定義しておらずポルナレフ状態になってました。

原因と対応

マイグレーションのファイル名とファイル内で定義されているクラス名が一致していなかったためでした。

【ファイル名】
2022_05_21_000001_create_demohoge.php

【クラス名】

class CreateDemo extends Migration
{
     public function up()
    {
        Schema::create('demo', function (Blueprint $table) {
...

クラス名を正とする場合は、ファイル名を 2022_05_21_000001_create_demo.php とする必要があります。(この例ではわかりやすくしていますが、実際は気づきづらいスペルミスでした)

本来はmake:migrationコマンドでマイグレーションファイルを作成するべきですが、めんどくさがって既存のファイルをコピーしてマイグレーションファイルを作成したのがまずかったです。

とはいえ、このエラーメッセージがとてもわかりづらく少し時間を浪費してしまいした…orz

なお本当にクラスが重複している場合も、もちろんこのエラーメッセージが出力されます。

Tips

なお同じPHPフレームワークであるCakePHPでは、以下のとおり名前が一致していない場合と本当に重複している場合で、エラーメッセージがわかれています。

## ファイル名とクラス名が一致していない場合
$ docker compose exec phpfpm app/bin/cake migrations migrate
...
InvalidArgumentException: Could not find class "CreateDemos" in file "/var/www/app/config/Migrations/20220521000001_CreateDemos.php" in /var/www/app/vendor/robmorgan/phinx/src/Phinx/Migration/Manager.php:756
...
$
## 本当にクラスが重複している場合
$ docker compose exec phpfpm app/bin/cake migrations migrate
...
InvalidArgumentException: Migration "20220521000002_CreateDemos.php" has the same name as "20220521000001_CreateDemos.php" in /var/www/app/vendor/robmorgan/phinx/src/Phinx/Migration/Manager.php:736
...
$

今回は以上です〜ノシ