マイグレーションとは
マイグレーションはデータベースのバージョン管理のようなものです。 チームがアプリケーションのデータベーススキーマ定義を共有・管理できます。 ソースコードを pull した後に「ローカルのデータベースにカラムを手動で追加してください」とチームメンバーに伝えなければならない場面を経験したことがあるでしょう。 マイグレーションはその問題を解決します。 マイグレーションファイルはdatabase/migrations ディレクトリに格納されます。
各ファイル名にはタイムスタンプが含まれており、Laravelがマイグレーションの実行順序を決定するために使われます。
マイグレーションファイルの作成
make:migration Artisanコマンドで新しいマイグレーションファイルを生成します。
create_posts_table という名前であれば、posts テーブルを作成するコードがあらかじめ用意されます。
マイグレーションの構造
マイグレーションクラスはup と down の2つのメソッドを持ちます。
upメソッド:テーブル・カラム・インデックスをデータベースに追加します。downメソッド:upの操作を元に戻します。ロールバック時に呼ばれます。
主なカラム定義メソッド
Blueprint クラスには多くのカラム型が用意されています。
| メソッド | 説明 |
|---|---|
$table->id() | 自動増分の主キー(bigIncrements('id') の別名) |
$table->string('name') | VARCHAR相当のカラム(デフォルト255文字) |
$table->text('body') | TEXTカラム |
$table->integer('count') | INTEGERカラム |
$table->boolean('active') | TINYINTで真偽値を格納 |
$table->timestamp('published_at') | TIMESTAMPカラム |
$table->timestamps() | created_at と updated_at をまとめて追加 |
$table->softDeletes() | 論理削除用の deleted_at カラムを追加 |
$table->foreignId('user_id') | 外部キー用の BIGINT UNSIGNEDカラム |
カラム修飾子
カラム定義にはメソッドチェーンで修飾子を追加できます。マイグレーションの実行
migrate コマンドで未実行のマイグレーションをすべて実行します。
migrate:status を使います。
ロールバック
直近のマイグレーションバッチを取り消すにはmigrate:rollback を使います。
--step オプションを指定します。
migrate:refresh を使います。
migrate:refresh はすべてのテーブルを作り直すため、既存のデータは失われます。
開発中のデータベースリセットに便利です。実践例:postsテーブルの作成
ブログ投稿を管理するposts テーブルを例に、一連の流れを確認します。
1. マイグレーションファイルの生成
2. マイグレーションの編集
database/migrations/xxxx_xx_xx_xxxxxx_create_posts_table.php を開いて編集します。
3. マイグレーションの実行
posts テーブルが作成されます。
4. カラムを後から追加する
テーブル作成後に新しいカラムを追加したい場合は、既存のマイグレーションを編集せず、新しいマイグレーションを作成します。マイグレーションイベント
マイグレーション操作のたびにイベントが発行されます。すべてのイベントはIlluminate\Database\Events\MigrationEvent を継承しています。
| クラス | 説明 |
|---|---|
Illuminate\Database\Events\DatabaseRefreshed | migrate:refresh コマンドの完了後 |
Illuminate\Database\Events\MigrationsStarted | マイグレーションのバッチが実行される直前 |
Illuminate\Database\Events\MigrationsEnded | マイグレーションのバッチの完了後 |
Illuminate\Database\Events\MigrationStarted | 単一のマイグレーションが実行される直前 |
Illuminate\Database\Events\MigrationEnded | 単一のマイグレーションの完了後 |
Illuminate\Database\Events\NoPendingMigrations | マイグレーションコマンドが未実行のマイグレーションなしと判定した時 |
Illuminate\Database\Events\SchemaDumped | データベーススキーマダンプの完了後 |
Illuminate\Database\Events\SchemaLoaded | 既存のスキーマダンプのロード後 |
MigrationsEnded イベントをリッスンして、マイグレーション完了後にキャッシュをクリアすることができます。
次のステップ
データベースシーディング
マイグレーションで作成したテーブルにサンプルデータを投入する方法を学びます。
Eloquent入門
マイグレーションで作成したテーブルをEloquent ORMで操作する方法を学びます。