🚀

Laravel マイグレーションコマンド まとめ

2023/01/11に公開

はじめに

ユニットテストで利用可能なRefreshDatabaseトレイト、DatabaseMigrationsトレイトで動いているマイグレーションコマンドがどのような動きをするのか調べる機会があったのでちょっとまとめてみました。

環境

  • Laravel 9.46.0

コマンド一覧

make:migration

$ php artisan make:migration ファイル名

マイグレーションファイルの作成する。

migrate

$ php artisan migrate

マイグレーションを実行する。

$ php artisan migrate --pretend

--pretendオプションを付けると、実行するSQL文の確認できる。
その場合、SQLは実行されない。

下記の記事に--pretendオプションを試した内容が書いてあります。
https://zenn.dev/naopusyu/articles/c2436e50db8f2a

migrate:rollback

$ php artisan migrate:rollback

最後に実行したマイグレーションの実行をロールバックする。

$ php artisan migrate:rollback --step=3

--stepオプションを指定した場合、指定した数だけロールバックが実行される。

migrate:reset

$ php artisan migrate:reset

すべてのマイグレーションの実行をロールバックする。

migrate:refresh

$ php artisan migrate:refresh

migrate:resetコマンドを実行し、migrateコマンドを実行する。

$ php artisan migrate:refresh --step=3

--stepオプションを付けるとmigrate:resetコマンドではなく、migrate:rollbackコマンドを実行し、migrateコマンドを実行する。

migrate:fresh

$ php artisan migrate:fresh

すべてのテーブルを削除し、migrateコマンドを実行する。
テーブルの削除にはdb:wipeコマンドを実行している。
ただし、削除されるのは、--databaseオプションで指定したデータベースのみ。
未指定の場合はデフォルトの接続先になる。

migrate:install

$ php artisan migrate:install

migrationsテーブルを作成する。
テーブル名はここで変更が可能
このコマンドは直接実行することはなく、migrateコマンドから実行される。

migrate:status

$ php artisan migrate:status

実行したマイグレーションを確認する。

まとめ

今更ながら、調べてみて、
migrate:resetmigrate:refreshmigrate:freshの3つコマンドの動きの違いがわかりました。

また、RefreshDatabaseトレイト、DatabaseMigrationsトレイト共にテスト開始時にmigrate:freshコマンドを実行していたんですね。
RefreshDatabaseトレイトは名前の通りmigrate:refreshコマンドを実行していると思っていたんですが違ったようです。

こういう調べものは、間違えを直せたりできるので違う内容でまたやりたいと思います。

GitHubで編集を提案

Discussion