【laravel】マイグレーション、やり直しコマンドいろいろ

テーブルの修正、再構築のコマンドについて簡単にメモします。

マイグレーションはそのDBのmigrationsテーブルで管理されます。
migrationsテーブルにはbatchというカラムがあり、値の順にmigrateされたことを表します。下のDBではcreate_photos_tableファイルが直近で実行されたということになります。
<img width="512" alt="スクリーンショット 2020-02-05 11.51.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502145/ac4843be-a700-4c0f-5dec-23373ae16788.png">
###status
マイグレーションの状態を確認します。

```
php artisan migrate:status

+------+------------------------------------------------+-------+
| Ran? | Migration                                      | Batch |
+------+------------------------------------------------+-------+
| Yes  | 2014_10_12_000000_create_users_table           | 1     |
| Yes  | 2014_10_12_100000_create_password_resets_table | 1     |
| Yes  | 2019_08_19_000000_create_failed_jobs_table     | 1     |
| Yes  | 2020_02_05_015307_create_albums_table          | 2     |
| Yes  | 2020_02_05_020352_create_photos_table          | 3     |
+------+------------------------------------------------+-------+
```
このDBでは1,2,3の順でマイグレーションが実行されたこと表しています。

###rollback
**ロールバック**（直前に行った一連のマイグレーションをなかったことにする）
・down()メソッドに書かれた処理が実行されます。
・先ほどのDBではbatchが3のマイグレーションがロールバックされ、状態は「No」と表示される

```
$ php artisan migrate:rollback
```

ロールバックが実行されるとRanのところが「No」と表示されます。

```
+------+------------------------------------------------+-------+
| Ran? | Migration                                      | Batch |
+------+------------------------------------------------+-------+
| Yes  | 2014_10_12_000000_create_users_table           | 1     |
| Yes  | 2014_10_12_100000_create_password_resets_table | 1     |
| Yes  | 2019_08_19_000000_create_failed_jobs_table     | 1     |
| Yes  | 2020_02_05_015307_create_albums_table          | 2     |
| No   | 2020_02_05_020352_create_photos_table          |       |
+------+------------------------------------------------+-------+
```

・--stepのオプションで[数値]回のロールバックを行います。
batchの値が3の場合、php artisan migrate:rollback --step=2をするとbatchが1の状態まで戻ります。

```
$ php artisan migrate:rollback --step=[数値]
```
###reset 
すべてのマイグレーションをロールバックします。

```
$ php artisan migrate:reset
```
```
$ php artisan migrate:reset
Rolling back: 2020_02_05_015307_create_albums_table
Rolled back:  2020_02_05_015307_create_albums_table 
Rolling back: 2019_08_19_000000_create_failed_jobs_table
Rolled back:  2019_08_19_000000_create_failed_jobs_table 
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:  2014_10_12_100000_create_password_resets_table 
Rolling back: 2014_10_12_000000_create_users_table
Rolled back:  2014_10_12_000000_create_users_table 

$ php artisan migrate:status
+------+------------------------------------------------+-------+
| Ran? | Migration                                      | Batch |
+------+------------------------------------------------+-------+
| No   | 2014_10_12_000000_create_users_table           |       |
| No   | 2014_10_12_100000_create_password_resets_table |       |
| No   | 2019_08_19_000000_create_failed_jobs_table     |       |
| No   | 2020_02_05_015307_create_albums_table          |       |
| No   | 2020_02_05_020352_create_photos_table          |       |
+------+------------------------------------------------+-------+
```
すべてのマイグレーションの状態が「No」となります。

###refresh
すべてのマイグレーションをロールバックしてから再びマイグレーションします。

```
$ php artisan migrate:refresh
```

```
$ php artisan migrate:refresh

Rolling back: 2020_02_05_020352_create_photos_table
Rolled back:  2020_02_05_020352_create_photos_table (0.02 seconds)
Rolling back: 2020_02_05_015307_create_albums_table
Rolled back:  2020_02_05_015307_create_albums_table (0.02 seconds)
Rolling back: 2019_08_19_000000_create_failed_jobs_table
Rolled back:  2019_08_19_000000_create_failed_jobs_table (0.02 seconds)
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:  2014_10_12_100000_create_password_resets_table (0.02 seconds)
Rolling back: 2014_10_12_000000_create_users_table
Rolled back:  2014_10_12_000000_create_users_table (0.02 seconds)
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.04 seconds)
Migrating: 2020_02_05_015307_create_albums_table
Migrated:  2020_02_05_015307_create_albums_table (0.04 seconds)
Migrating: 2020_02_05_020352_create_photos_table
Migrated:  2020_02_05_020352_create_photos_table (0.04 seconds)
```
###fresh
すべてのテーブルを**ドロップ（削除）**してから再びマイグレーションします。

```
$ php artisan migrate:fresh
 
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.04 seconds)
Migrating: 2020_02_05_015307_create_albums_table
Migrated:  2020_02_05_015307_create_albums_table (0.04 seconds)
Migrating: 2020_02_05_020352_create_photos_table
Migrated:  2020_02_05_020352_create_photos_table (0.04 seconds)
```
**refresh**と異なるのはロールバックが行われないこと。つまりdown()メソッドが実行されずにDBの再構築が行われる点。
したがって複数DBを持つプロジェクトでは**fresh**を行うとエラーが出てしまいます。なぜなら一方のDBだけが削除されてしまうためです。

###まとめ
・**status**　マイグレーションの状態確認
・**rollback**　直前のマイグレーションをロールバック
・**reset**　すべてのマイグレーションをロールバック
・**refresh**　すべてのマイグレーションをロールバックしmigrateを実行。
・**fresh**　すべてのテーブルを削除しmigrateを実行。