Laravel

Laravelマイグレーション入門|テーブルの作成・編集・外部キー

マイグレーションは、データベースのテーブル構造を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()にその逆の操作(ロールバック用)を記述します。

database/migrations/xxxx_create_employees_table.php
<?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には様々なカラム型に対応するメソッドが用意されています。よく使うものを以下にまとめます。

PHP
// === 文字列・テキスト ===
$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許可、デフォルト値、インデックスなど、よく使う修飾子を紹介します。

PHP
$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()メソッドを使って簡潔に定義できます。

PHP
// シンプルな外部キー定義
$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でデータベースに反映する