マイグレーションファイルが多くなってしまった場合は圧縮してしまうという選択肢(laravel)

2 min read読了の目安(約2400字

laravel8の公式ドキュメントを見ていてLaravelのマイグレーションファイルは圧縮できることを知ったので試してみました。

Laravel7系のドキュメントには無かったので、Laravel8系からの新機能だと思われます。

準備

usersテーブルに関するマイグレーションファイルを3つ用意してみました。

1つ目はデフォルトで用意されているものです。

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

2つ目はSNSログインする想定で、sns系のidをいれるカラムを追加しました

    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('google_id')->nullable()->after('password');
            $table->string('twitter_id')->nullable()->after('google_id');
            $table->string('facebook_id')->nullable()->after('twitter_id');
        });
    }

3つ目はプロフィール画像をいれるカラムを追加してみました。

    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->text('profile_image_url')->after('email_verified_at');
        });
    }

このようにシステム開発を進めるとどんどんどんどんマイグレーションファイルが増えてしまうことがありますよね。

既存DBのスキーマをダンプしてマイグレーションファイルを削除する

php artisan schema:dump --prune

このコマンドを実行するとマイグレーションファイルが全て削除されて、スキーマをダンプされたファイル(database/schema/mysql-schema.dump)が生成されます。

実際に migrations がディレクトリごとなくなっていて、 schema ディレクトリが出来ていました。

$ ls database/                        
factories schema    seeders

このコマンドを実行した後は、マイグレーションをロールバックすることはできなくなりますので注意してください。

$ php artisan migrate:reset      
Migration not found: 2021_05_02_232642_add_thumbnail_url_to_users_table
Migration not found: 2021_05_02_232439_add_sns_id_to_users_table
Migration not found: 2019_08_19_000000_create_failed_jobs_table
Migration not found: 2014_10_12_100000_create_password_resets_table
Migration not found: 2014_10_12_000000_create_users_table

例えば開発メンバーが1人増えたなどで、新しいメンバーがマイグレーションを実行したい場合は、これまで通り $ php artisan migrate でOKです。

$ php artisan migrate 
Migration table created successfully.
Loading stored database schema: /Users/naoki/programming/for_study/database/schema/mysql-schema.dump
Loaded stored database schema. (101.61ms)
Nothing to migrate.

終わりに

マイグレーションファイルの圧縮について試してみました。
システム開発期間が長くなるとマイグレーションファイルが超多くなってくることがあるので、その場合は圧縮してみるのも良いと思いました。