じぶん対策

日々学んだことをアウトプットして備忘録にしています。

マイグレーションについて

参考

https://readouble.com/laravel/8.x/ja/migrations.html#column-method-integer

https://tohokuaiki.hateblo.jp/entry/2016/12/26/%E3%80%8CLaravel%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%E3%80%8D3_%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9

https://onetech.jp/blog/how-to-migration-in-laravel-11913#:~:text=%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AF%E3%80%81Laravel%E3%82%92%E7%94%A8,%E5%8A%B9%E7%8E%87%E3%82%82%E5%90%91%E4%B8%8A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

マイグレーションとは

Lravel公式には以下の記述があります。

マイグレーションはデータベースのバージョン管理のようなもので、チームがアプリケーションのデータベーススキーマを定義および共有できるようにします。ソース管理から変更を取得した後に、ローカルデータベーススキーマにカラムを手動で追加するようにチームメートに指示する必要があったことを経験していれば、データベースのマイグレーションにより解決される問題に直面していたのです。

マイグレーションとは、「移行」を意味します。 テーブル定義を管理するために実行するコマンドです。 テーブルに変更があった際、チームのメンバーのテーブルを簡単にアップデートが行えます。

Laravelにおけるマイグレーション

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

php artisan make:migration ファイル名

上記コマンドを実行すると、database/migrationsの下にマイグレーションファイルが作成されます。

この時のファイル名には、Laravelがマイグレーションの順序を決定できるようにするタイムスタンプを含めて作成されます。

ただし、この時指定するファイル名が既存のものと被るとClass名として被るため、Fatalになって失敗します。

これを回避するために、create_hogehoge_tableみたいな感じで操作名とテーブル名などを含むようにして被ることの無いよう工夫する必要があります。

マイグレーションファイルの編集

先述したartisanコマンドでマイグレーションファイルを作成すると、デフォルトでupdownというメソッドが定義されています。

upメソッドにはデータベース構造の変更を実施する際に実行される内容を記述します。 downメソッドにはupメソッドの操作を元に戻す内容を記述します。

記述後、

php artisan migrate

を実行することでマイグレーションが実行されます。

マイグレーションの取り消し

マイグレーションを行った後、取り消したい場合には以下のコマンドを実行することでロールバックすることができます。

php artisan migrate:rollback
php artisan migrate:reset

また、指定した回数分巻き戻す場合は--stepオプションで巻き戻したい件数を指定しましょう。

全てのデータベースマイグレーションロールバックし、それからmigrateコマンドを実行したい場合は以下のコマンドで対応できます。データベース全体を作り直すために便利なコマンドです。

php artisan migrate:refresh

また、--seedオプションを付けることで全データベースシードを実行できます。

まとめというかメモ

マイグレーションという仕組みを用いることで、チームで開発する際のデータベースの更新の際に生じる問題を解決できます。

詳細なSchemaビルダの使い方は公式ドキュメントに説明を譲るとして、注意しとかないといけないなと感じた箇所をメモしておきます。

  • changeメソッドは存在するカラムを新しいタイプへ変更するか、カラムの属性を変える際に使用します。
  • $table->timestamps();created_atupdated_atの二つのカラムが追加されます。
  • 文中でも一度書きましたが、名前被りには気をつける。
  • migrationはあくまでテーブルの構造なので、中身を作成するのはseederで行う。

所感

Laravelの仕組みを用いることで、チーム開発が捗る部分がとても多いなということを日々実感します。

ただし、Laravelの機能を使用するということはつまり、Laravelに依存するということになります。

クリーンアーキテクチャを意識すると、フレームワークに依存する箇所とそうでない、生のPHPを使用する箇所を分離することになります。 どの部分がLaravelの機能で、どの部分がPHPの機能なのか、しっかり分けられるよう意識しておかないと初学者のうちはごちゃ混ぜになってしまいそうなので気をつけたいと感じました。