migration とは
データベースの作成や編集、削除などをバージョン管理する方法として、Laravelには「migration (マイグレーション)」というものが備わっています。
だれが、いつ、どういった目的でテーブルの作成・編集・削除を行ったのかがわかる優れものです。
本 wiki の目標
・データベースのバージョン管理方法である migration について知ること。
・テーブルの追加、編集、削除を行えるようにすること。
・migration ファイルの命名規則を HUB3 内で統一すること。
・artisan migrate と artisan migrate:refresh と artisan migrate:fresh の違いを理解すること。
新規作成時
例として下記のような tests テーブルを新規作成する。
物理名 | 論理名 | 主キー | unique | null | データ型 | デフォルト値 |
---|---|---|---|---|---|---|
id | ID | ○ | ○ | bigint | ||
name | 名前 | ○ | varchar | |||
status | 表示状況 | int | 0 | |||
user_id | ユーザー識別ID | bigint | ||||
remark | 備考 | ○ | varchar | |||
created_at | 作成日時 | timestamp | ||||
updated_at | 更新日時 | ○ | timestamp |
※注意
一度実行された migration ファイルは基本的に再度実行されないため、テーブル内容の編集時には後述のやり方を参考すること。
手順
- マイグレーションファイルの作成
- マイグレーションファイルの編集
- マイグレーションの実行
1. マイグレーションファイルの作成
sail artisan make:migration create_tests_table
成功すれば database/migrations ディレクトリ内に現在日時_create_tests_table.phpが作成されます。
2. マイグレーションファイルの編集
上記コマンド実行後に下記のようにファイルが作成されます。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('tests', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('tests');
}
};
「up」内にはテーブル作成時の処理、「down」内にはテーブル削除時の処理を書きます。( ※ロールバック処理の時に「down」が呼び出されるため )
下記が追加した後の内容です。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('tests', function (Blueprint $table) {
$table->id();
$table->string('name')->unique()->comment('名前');
$table->integer('status')->default(0)->comment('表示状況');
$table->bigInteger('user_id')->comment('ユーザー識別ID');
$table->string('remark')->comment('備考')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('tests');
}
};
id については $table->id();
にて自動増分 ( Auto Increment ) の id カラムが作成され、主キーと認識されます。
created_at, updated_at については $table->timestamps();
にてどちらも追加されます。
わかりやすいように ->commnet('論理名')
を必ずつけましょう。
データ型、カラム修飾子参考 https://qiita.com/Takahiro_Nago/items/51eb0e9f1c8bbc2c9852
3. マイグレーションの実行
sail artisan migrate
こちらを実行で env に接続された DB へ新規テーブルが作成されます!
設計の内容と相違なければ完了です。
カラム編集時
例として tests テーブルから text カラム ( 本文 ) を追加し、
既存カラムに対しても更新を行う
status のデータ型を varchar に変更
user_id を unique を設定
remark のカラム名を remark_update に変更
物理名 | 論理名 | 主キー | unique | null | データ型 | デフォルト値 |
---|---|---|---|---|---|---|
id | ID | ○ | ○ | bigint | ||
name | 名前 | varchar | ||||
status | 表示状況 | varchar | 0 | |||
user_id | ユーザー識別ID | ○ | bigint | |||
remark_update | 備考 | ○ | varchar | |||
created_at | 作成日時 | timestamp | ||||
updated_at | 更新日時 | ○ | timestamp |
手順
手順自体は新規作成時と変わりませんが、ファイルの命名、「down」の処理内容に修正が必要なためそちらのみ記載します。
- マイグレーションファイルの作成
- マイグレーションファイルの編集
- マイグレーションの実行
1. マイグレーションファイルの作成
カラム追加・更新 sail artisan make:migration modify_tests_table --table=tests
カラム削除 sail artisan make:migration remove_column_from_tests_table --table=tests
2. マイグレーションファイルの編集
作成ファイルに対し、追加の場合は下記のように記載します。
「up」内にはテーブルに対しての処理、「down」内には「up」の処理内容を打ち消す処理を書きます。
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('tests', function (Blueprint $table) {
// textカラムの追加
$table->string('text')->comment('本文')->nullable();
// 既存カラムの更新
$table->string('status')->comment('表示状況')->change();
$table->bigInteger('user_id')->comment('ユーザー識別ID')->unique()->change();
$table->renameColumn('remark', 'remark_update');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('tests', function (Blueprint $table) {
// textカラムの削除
$table->dropColumn('text');
// 既存カラムを戻す
$table->integer('status')->comment('表示状況')->change();
$table->bigInteger('user_id')->comment('ユーザー識別ID')->unique(false)->change();
$table->renameColumn('remark_update', 'remark')->change();
});
}
};
カラム更新についてはこちらを参考にしました。https://qiita.com/mdrq/items/f10e488caa4497eec79b
3. マイグレーションの実行
sail artisan migrate
カラムが編集、追加されていれば完了です!
よく使うコマンド
sail artisan migrate
migration ファイルの up の処理を実行し、テーブルの作成を行います。
一度実行したファイルは実行されません。
sail artisan migrate:refresh
migrations ファイルの down の処理を実行しロールバックを行った後に migrations ファイルの up の処理を実行し、テーブルの作成を行います。
一度実行したファイルも実行されますが、ロールバックされたテーブルのデータはリセットされます。
sail artisan migrate:fresh
テーブルを削除した後に migrations ファイルの up の処理を実行し、テーブルの作成を行います。
down は実行されず、migrations にて管理されていないテーブルも削除されます。
sail artisan migrate:rollback
migrations ファイルの down の処理を実行しロールバックする
sail artisan migrate:rollback --step=1
migrations ファイルの最新の 1 件をロールバックする
数字部分を変えることで何件ロールバックするか変更することができます。
新しく migration ファイルを作成した際に down の記述ができているか確認が行えます。
トラブルシューティング
・$table->increments('id');
と $table->id();
は何が違うの?
$table->increments('id');
は古いバージョンの Laravel で使用されていた方法で新しいバージョン(5.8以降)では非推奨とされています。