開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. Laravel のマイグレーションちょいメモ(無名クラスによるマイグレーションについて)
no-image

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



 

  • posted by やまちゃん
  • Laravel
TOPに戻る