テーブルの修正、再構築のコマンドについて簡単にメモします。
マイグレーションはそのDBのmigrationsテーブルで管理されます。
migrationsテーブルにはbatchというカラムがあり、値の順にmigrateされたことを表します。下のDBではcreate_photos_tableファイルが直近で実行されたということになります。
###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を実行。