過去ブログのQiitaへの移転シリーズ第3弾、今回はこの記事を移転しようと思うのですが、記事を書いたのが2年5ヶ月も前のことで、当時はLaravel5.3だったのが今(2019年2月時点)や5.7、本当時が過ぎるのは早い・・・
とりあえず、ここを参考に相違点に気をつけつつ記事をアップしてみようと思います。
当時在籍していた会社の勉強会で、Laravel5.2から5.3になって気をつけることというテーマで発表したのですが、そのときに5.3ではmigrateのrollbackでステップ数が指定できるという話題がありました。
これはどういうことかというと、5.2まではmigrate:rollbackと打つと最後にmigrateを行う前の状態に戻るというものでした。
つまり、最後にA,B,Cの3つをmigrateした後にrollbackするとA,B,Cが元に戻る(正確にはdownメソッドにupと逆の処理を書くことによって、downメソッドが呼ばれて元に戻る)ことになるわけです。
つまり、今まではA,B,CのうちCだけを取り消すということはできなかったわけです(migrationテーブルのbatch絡むを書き換えればできるようにはなりますが)。
それが、5.3以降では
php artisan migrate:rollback --step=1
とすることでCだけを取り消すことができるようになりました。 これも、より正確に言うと、migrationファイルは作ったときにファイル名の頭にタイムスタンプがついて(php artisan make:migration testと打つと2016_09_30_153344_test.phpというファイルが作られる)、それを昇順に並べて一番最後にくるものが取り消されるわけです。
また、他にも最初にA,B,Cをmigrateした後にD,Eをmigrateした状態でrollbackするとD,Eだけが元に戻るのですが、
php artisan migrate:rollback --step=4
とやるとB,C,D,Eを元に戻すということもできたりします。
つまり、migrationテーブルはこんな感じになっていて、
php artisan migrate:rollback
だけだとbatchカラムの値が一番大きいもの全てをロールバックするのですが、
php artisan migrate:rollback --step=*
だと、migrationカラムについて降順に*個をロールバックするわけですね。
とはいえ、rollback機能は便利な時もありますが、イレギュラーな処理であるのも確かなので、あまり行わずに済むよう正確に作業をするのが一番いいですね。
後、rollbackから離れて上の画像の2016_0601*_createoauth*_tableというものが5つあります。これらはLaravel Passport (OAuth2という認証周りのサービス)をインストールした後でmigrateしたときにできるのですが、これらのmigrationファイルは、database/migrationsの中にはありません。 vendor/laravel/passport/database/migrationsにあったりします。実際このファイルをいじることは滅多にないと思いますが(というより、よほどの理由がない場合vendor配下のファイルをいじるのは禁じ手のはず)。
ちなみに、Laravel Passportを使う場合は
composer require laravel/passport
でPassportをインストールする必要があります。この辺も使って見たかったけど、今まで使う気配はなかったので、就職活動中のこの機会に勉強してみようかな。
と、ここまでアップしながら5.3と5.7のロールバック周りで変わったところがないかざっと見てみましたが、ロールバック周りでは5.3以降で特に変わったところはなさそうです。
2020/12/30追記
ありがたいことにそこそこのいいね(LGTM)をいただいているので、少し記事をアップデートして見ます。
Laravelから離れて2年近くになっていますが、その間にLaravelのバージョンが8.xまで進化しているんですね・・・(驚き)
で、マイグレーション周りはどうなったか調べてみると、
php artisan schema:dump
でマイグレーションを単一のSQLファイルに圧縮することとかができるようになったんですね。これはなかなか便利かも。
あとは、
php artisan migrate:fresh
で全てのテーブルを削除した後にマイグレーションを行うことができるようになっていますね。環境を1から作り直すときなんかでもしかしたら使う機会はあるかも。
現在の自分の主戦場はLaravelでなくSpringBootなので、Flywayでのマイグレーションについてもいつか記事にしてみようかと。
後は、来年の目標として個人で簡単なWebサービスを作ってみようと思っているので、それをSpringBootでやるかLaravelでやるか迷っていて、LaravelでやるとしたらLaravel関連の記事をアップする機会が増えるかも。