🚤

Laravel マイグレーションファイルを作成する際のちょっとした名前規則

2024/01/09に公開

前置き

php artisan make:migration する際のドキュメントに載っていない密かな名前規則について書いてみたいと思います。名前規則に従った名前にすると、--table=テーブル名 とか省けるよ、とかそんなお話です。

なお、実際の動作は、Laravel Ver.10.33 にて確認していますが、結構古いバージョンでも行けます。

本題

マイグレーション用のファイルには、新規作成用と修正用のファイルがありますが、まずは新規作成時から見て行きます。

新規作成用

まずは気にせず次のコマンドでマイグレーションファイルを作成してみます。

php artisan make:migration hoge

すると、2024_01_06_144325_hoge.php みたいなファイル名で、中身は以下になります。(コメントや細かい部分は省略)

return new class extends Migration
{
    public function up(): void
    {
        //
    }

    public function down(): void
    {
        //
    }
};

少し寂しい感じですね…🥲
では今度は、--create=テーブル名 を付けて見ます。

php artisan make:migration hoge --create=posts

すると中身はこうなりました。

return new class extends Migration
{
    public function up(): void
    {
+        Schema::create('posts', function (Blueprint $table) {
+            $table->id();
+            $table->timestamps();
+        });
    }

    public function down(): void
    {
+        Schema::dropIfExists('posts');
    }
};

Schema::create('posts') などが付いてくれました。
ですが、さすがにファイル名に hoge は意味不明ですね。
ということで、以下のコマンドのいずれかで作成すれば、

php artisan make:migration create_posts
php artisan make:migration create_posts_table

Laravel が以下の形式を自動で認識して、

create_(テーブル名)
create_(テーブル名)_table

上記と同じファイルを作成してくれます。

まぁ最も、新規作成時は、モデルファイルとかと一緒に作成する事が多いので、あまり出番はないかも知れませんが。

php artisan make:model Post -mf

とか。

修正用

では今度は、先程 --create=posts とした箇所を --table=posts に変えて、以下のコマンドを叩いてみます。

php artisan make:migration hoge --table=posts

すると、今度は修正用としてファイルが生成されました。

return new class extends Migration
{
    public function up(): void
    {
+        Schema::table('posts', function (Blueprint $table) {
+            //
+        });
    }

    public function down(): void
    {
+        Schema::table('posts', function (Blueprint $table) {
+            //
+        });
    }
};

Schema::create ではなく、Schema::table となっているのが確認できます。

例によって、hoge は意味不明なので、より現実的なファイル名を付けるのですが、修正用の場合は、以下の名前規則に従うと、--table=posts を付けなくて大丈夫になります。

xxx_(to|from|in)_(テーブル名)
xxx_(to|from|in)_(テーブル名)_table

例えば、

php artisan make:migration add_status_to_posts_table

とすれば、直前で見たファイルと同じファイルができあがります。--table=テーブル名 を省けるという微妙な感じがいいですね。

詳しくは、ソースの正規表現をチラ見して見ると分かり易いかも知れません。

    const CREATE_PATTERNS = [
        '/^create_(\w+)_table$/',
        '/^create_(\w+)$/',
    ];

    const CHANGE_PATTERNS = [
        '/.+_(to|from|in)_(\w+)_table$/',
        '/.+_(to|from|in)_(\w+)$/',
    ];

参考ソース:
TableGuesser.php

雑感

しかし、日付&時刻が付いてファイル名が長くなるのは、どうにかならないものでしょうか…。

間違い等ありましたらコメントお願いします。

Discussion