マイグレーションは、データベースのテーブル構造をPHPコードで管理する仕組みです。SQLを直接書く代わりに、テーブルの作成・変更・削除をPHPのメソッドで定義し、コマンド1つでデータベースに反映できます。バージョン管理システムと組み合わせることで、チーム全員が同じデータベース構造を簡単に再現できるようになります。
モデルとマイグレーションの作成
データベースに新しいテーブルを作成するには、Artisanコマンドでモデルとマイグレーションファイルを同時に作成します。
# モデルとマイグレーションを同時に作成(-m オプション)
php artisan make:model Employee -m
# マイグレーションのみ作成
php artisan make:migration create_employees_table
# 既存テーブルにカラムを追加するマイグレーション
php artisan make:migration add_email_to_employees_table --table=employees
-mオプションを付けると、以下の2つのファイルが同時に作成されます。
app/Models/Employee.php- モデルファイルdatabase/migrations/xxxx_xx_xx_xxxxxx_create_employees_table.php- マイグレーションファイル
Laravelの命名規則では、モデル名は単数形のPascalCase(例:Employee)、テーブル名は複数形のスネークケース(例:employees)になります。この規則に従えば、Laravelが自動的にモデルとテーブルを紐付けます。
マイグレーションファイルの構造
マイグレーションファイルにはup()とdown()の2つのメソッドがあります。up()にテーブルの作成・変更処理を、down()にその逆の操作(ロールバック用)を記述します。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('employees', function (Blueprint $table) {
$table->id(); // 自動採番の主キー
$table->string('name'); // 名前(VARCHAR)
$table->string('email')->unique(); // メール(一意制約)
$table->text('address'); // 住所(TEXT)
$table->string('phone'); // 電話番号
$table->date('birth_date'); // 生年月日
$table->foreignId('department_id') // 外部キー
->nullable()
->constrained('departments')
->onDelete('set null');
$table->timestamps(); // created_at, updated_at
});
}
public function down(): void
{
Schema::dropIfExists('employees');
}
};
この例では、employeesテーブルに id、name、email、address、phone、birth_date、department_id、created_at、updated_at の各カラムが作成されます。
主なカラム定義メソッド
Laravelには様々なカラム型に対応するメソッドが用意されています。よく使うものを以下にまとめます。
// === 文字列・テキスト ===
$table->string('name', 100); // VARCHAR(長さ指定可)
$table->text('description'); // TEXT(長文)
$table->char('code', 4); // CHAR(固定長)
// === 数値 ===
$table->integer('count'); // INT
$table->bigInteger('views'); // BIGINT
$table->decimal('price', 8, 2); // DECIMAL(全体8桁、小数2桁)
$table->float('rate'); // FLOAT
// === 日付・時刻 ===
$table->date('birth_date'); // DATE
$table->dateTime('published_at'); // DATETIME
$table->time('start_time'); // TIME
$table->timestamps(); // created_at + updated_at
// === その他 ===
$table->boolean('is_active'); // BOOLEAN
$table->json('settings'); // JSON
$table->softDeletes(); // deleted_at(論理削除用)
カラム修飾子
カラム定義の後にメソッドチェーンで修飾子を追加できます。NULL許可、デフォルト値、インデックスなど、よく使う修飾子を紹介します。
$table->string('name')->nullable(); // NULL値を許可
$table->string('email')->unique(); // 一意性制約
$table->integer('price')->default(0); // デフォルト値
$table->timestamp('published_at')->useCurrent(); // 現在時刻をデフォルト値に
$table->string('status')->index(); // インデックスを作成
$table->text('memo')->comment('備考欄'); // カラムコメント
// 修飾子の組み合わせ
$table->string('email')->nullable()->unique();
外部キーとリレーション
外部キー(Foreign Key)は、別のテーブルのレコードを参照するためのカラムです。foreignId()メソッドとconstrained()メソッドを使って簡潔に定義できます。
// シンプルな外部キー定義
$table->foreignId('department_id')->constrained();
// テーブル名を明示 + NULL許可 + 削除時の動作指定
$table->foreignId('department_id')
->nullable()
->constrained('departments')
->onDelete('set null');
// onDeleteオプションの種類
->onDelete('cascade') // 親削除時に子も削除
->onDelete('set null') // 親削除時にNULLにする
->onDelete('restrict') // 子が存在する場合は親の削除を禁止
nullable()を付けずにonDelete('set null')を指定すると、NULLを許容しないカラムにNULLを入れようとしてエラーになります。set nullを使う場合は必ずnullable()も付けてください。
マイグレーションの実行
マイグレーションファイルを作成したら、コマンドを実行してデータベースに反映します。
# 全ての未実行マイグレーションを実行
php artisan migrate
# マイグレーション状態を確認
php artisan migrate:status
# 直前のマイグレーションを取り消し(ロールバック)
php artisan migrate:rollback
# 全テーブルを削除して再作成(開発時のみ)
php artisan migrate:fresh
# 再作成 + シーダー実行
php artisan migrate:fresh --seed
migrate:freshは全テーブルを削除してから再作成するコマンドです。データが全て消えるため、本番環境では絶対に使用しないでください。本番でのテーブル変更は、新しいマイグレーションファイルを作成してphp artisan migrateを実行します。
まとめ
php artisan make:model -mでモデルとマイグレーションを同時に作成する- マイグレーションファイルの
up()にテーブル作成、down()にロールバック処理を書く string()、integer()、date()等のメソッドでカラム型を定義するnullable()、unique()、default()等の修飾子で制約を追加するforeignId()->constrained()で外部キーを簡潔に定義できるphp artisan migrateでデータベースに反映する