Laravelマイグレーション整理

## はじめに
Laravelを使用し、マイグレーション機能を使用してテーブルを作る時、マイグレーションファイルについて整理した。

テーブル作成時、以下のようなマイグレーションファイルを結果作成したので、それを元に記載する。
/Applications/MAMP/htdocs/work_flow/database/migrations
今回はMAMPを使用している。

```bash
.
├── 2014_10_12_000000_create_users_table.php
├── 2014_10_12_100000_create_password_reset_tokens_table.php
├── 2019_08_19_000000_create_failed_jobs_table.php
├── 2019_12_14_000001_create_personal_access_tokens_table.php
├── 2023_08_06_031748_create_projects_table.php
├── 2023_08_06_032207_create_project_user_table.php
├── 2023_08_06_032630_create_tasks_table.php
├── 2023_08_06_070530_add_user_id_to_projects_table.php
├── 2023_08_06_073841_add_completed_to_tasks_table.php
├── 2023_08_06_074451_add_default_value_to_status_in_tasks_table.php
└── 2023_08_06_074943_add_status_to_tasks_table.php
```

## マイグレーションファイル
2023_08_06_031748_create_projects_table.phpは以下を実行している
```
php artisan make:migration create_projects_table
```

2023_08_06_074943_add_status_to_tasks_table.phpは以下を実行している
```
php artisan make:migration add_status_to_tasks_table --table=tasks
```

2023_08_06_031748は実行した時のタイムスタンプである。

--table=tasksはテーブル名を間違いなく記載するオプション。

createとかaddとか特定のキーワードに対し特別な動作をするのではなく慣習的なものである。
命名規則として使用されている。

createが名前に含まれる場合、新しいテーブルを作成するためのマイグレーションが期待される。試したところ、down()にはSchema::dropIfExists('テーブル名')が記載されている。(つまりcreateで一応判断はしていると思う、バージョンによって確認要)

addが名前に含まれる場合、既存のテーブルにカラムを追加するためのマイグレーションが期待される。実際はファイルに手動でカラムを追加する。

## マイグレーションの処理方法
処理を１つ戻す、複数回戻す、データを取り直す場ありを例に挙げる。

・php artisan migrate:rollback
最後に実行されたバッチのマイグレーションをロールバックする。
この例では、日付が最も遅い2023_08_06_074943_add_status_to_tasks_table.phpがロールバックされる。

・php artisan migrate:rollback --step=3 
最後に実行された3バッチのマイグレーションをロールバックする。
この例では、以下がロールバックされる
2023_08_06_073841_add_completed_to_tasks_table.php
2023_08_06_074451_add_default_value_to_status_in_tasks_table.php
2023_08_06_074943_add_status_to_tasks_table.php

・php artisan migrate:fresh --seed
このコマンドは、データベース内の全テーブルをドロップし、マイグレーションを最初から実行し直す。さらに、--seedオプションが付いているため、全マイグレーションが完了した後に、データベースシーダーが実行されます。通常、DatabaseSeeder.phpファイルに定義されたシーダーが実行される。--seedがなければデーターベースシーダーが実行されないだけである。

## マイグレーションファイル作成例
先ほども述べたようにmigrateの記載に関わらず、大体同じものができる。
いずれのマイグレーションを実行しても大体変更前の記載になる。

今回色々マイグレーションファイルを作っているが、マイグレーションで追加したりしたものを１つにまとめた例を挙げる。
1.マイグレーションファイル作成
2.カラム、外部キー追加
3.マイグレーションファイルを１つにする。


1.マイグレーションファイル作成
```php
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('projects', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('description')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('projects');
    }
```
2.カラム、外部キー追加
php artisan make:migration add_user_id_to_projects_table --table=projects
(作成時)
```php
    public function up(): void
    {
        Schema::table('tasks', function (Blueprint $table) {
            //
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('tasks', function (Blueprint $table) {
            //
        });
    }

```

(カラム追加後)

```php

    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('projects', function (Blueprint $table) {
            //
            $table->unsignedBigInteger('user_id')->after('id');

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('projects', function (Blueprint $table) {
            //
            $table->dropForeign(['user_id']);
            $table->dropColumn('user_id');
        });
    }
```


3.マイグレーションファイルを１つにする。
1.2は最初から以下と同じこと
```php
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('projects', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->string('title');
            $table->text('description')->nullable();
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('projects');
    }

```