Laravel のマイグレーションちょいメモ(無名クラスによるマイグレーションについて)
こんにちは、12月になり寒くなってきて久しぶりにスノボがしたくなっているヤマモトです。
今回はLaravel8.37.0以降で導入されLaravel9.xからデフォルトの書き方になっている 無名クラスによるマイグレーションについてのちょいメモを紹介します。
環境
今回使用する環境は以下のようになります。
- PHP: 8.1.8
- Laravel Framework 9.22.1
無名クラスによるマイグレーションについて
Laravelを使用する方に説明の必要はないかと思いますが、マイグレーションとはデータベースのバージョン管理のようなもので、データベーススキーマの変更を実行可能なコードとして管理することで、チームメンバーの環境や他の環境での再現を容易にします。
Laravel8.37.0 より前ではマイグレーションファイルにはそれぞれクラス名が付けられていましたが、Laravel8.37.0以降、Laravel9以降では無名マイグレーションが導入されています。
無名クラスによるマイグレーションとは下記の記事にもあるように同名のマイグレーションクラスを作れなかった問題を解消する目的で導入されています。
https://laravel-news.com/laravel-anonymous-migrations
https://github.com/laravel/framework/issues/5899
では、Laravel9でtestテーブルのマイグレーションファイルを作成してみます。
php artisan make:migration create_test_table
Laravel 8.37.0より前は下記のようなマイグレーションファイルが作成されたかと思います
class CreateTestTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
......
このような感じで作成されていたかと思います。
しかしLaravel9以降では
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
......
このように無名クラスでマイグレーションファイルが作成されるようになっています。
ハマりポイント
自分はマイグレーション生成コマンドを複数回実行してしまい、同じテーブル名のマイグレーションファイルが2つ作成されてしまいました。
以前であれば作成前にエラーで止まるのでちょっと不便な感じがしてしまいます。
しかし、クラス名について悩まずに済んだり、ファイル名のリネームなどで面倒にならずに済むので良かった面もあるようですね!
現時点ではどちらの書き方もサポートされているようです。
Laravel8.37.0より前のバージョンで無名クラスで作成するためのカスタマイズ
こちらの記事にもあるようにstubファイルをカスタムすることでLaravel8でも無名クラスでマイグレーションファイルが作成されるようにカスタム可能です。
https://qiita.com/ucan-lab/items/eb10ec577d8e08226b33
下記コマンドを実行するとstubファイルが生成されます。
php artisan stub:publish
stubsディレクリにある以下のファイルを編集します。
migration.create.stub
migration.stub
migration.update.stub
migrationと名前の付くファイルの中身を以下のように変更します。
class {{ class }} extends Migration
↓
return new class extends Migration
そうすることでLaravel8.37.0より前のバージョンであっても無名クラスのマイグレーションファイルがデフォルトで作成されるように変更できます。
逆にLaravel9からLaravel8.37.0より前の記法に合わせてデフォルトでクラス名を定義することはできませんでした。
最後に
最後まで読んでいただきありがとうございます。
この記事が少しでも皆さんのお役に立てれば幸いです。
参考記事
https://readouble.com/laravel/9.x/ja/migrations.html#database-connection-table-options
https://qiita.com/ucan-lab/items/eb10ec577d8e08226b33
https://laracasts.com/series/whats-new-in-laravel-9/episodes/2