【Laravel】Migrationの基本:テーブルをコードで管理する

laravelアイキャッチ Laravel

こんにちは、かつコーチです。

前回まででルーティングとコントローラの基本的な応用を見てきました。

ここからはデータベース編に入っていきます。

最初のテーマは、Laravelでテーブルを作成・変更するときに欠かせない「Migration(マイグレーション)」です。

Migrationとは?

テーブル構造をコードで管理する仕組み

Migrationとは、データベースのテーブル構造(カラムの追加・変更・削除など)を、PHPのコードとして記録・管理する仕組みです。

普段データベースを操作するとき、phpMyAdminやTablePlusのようなGUIツールで直接テーブルを作成することもできます。

ですが、Laravelではそれをせず、Migrationファイルというコードを通してテーブルを作成するのが基本のスタイルです。

なぜGUIで直接テーブルを作らないのか

私が初めてLaravelに触れたとき、「わざわざコードでテーブルを作るなんて回りくどい」と感じていました。

phpMyAdminでポチポチとカラムを追加する方が、直感的で早いと思っていたからです。

ですが、チーム開発の現場に入って、この考えはすぐに覆されました。

ある案件で、私は自分のローカル環境で users テーブルに phone_number カラムを直接追加してしまったことがあります。

その状態でコードだけをGitにpushしたところ、他のメンバーの環境にはそのカラムが存在せず、「phone_number というカラムが見つかりません」というエラーが多発しました。

Migrationを使っていれば、カラム追加の変更履歴自体がコードとしてGitで共有され、他のメンバーはコマンド1つで同じテーブル構造を再現できたはずです。

この一件以来、私はテーブル構造の変更を「絶対にGUIで直接やらない」というルールを自分に課すようになりました。

Migrationファイルを作成する

make:migration コマンド

Migrationファイルは、Artisanコマンドで作成します。

php artisan make:migration create_posts_table

このコマンドを実行すると、database/migrations/ フォルダに、次のようなファイル名でファイルが生成されます。

2026_08_11_123456_create_posts_table.php

先頭の日時が実行順序を決めるため、常に新しいMigrationほど後に実行される仕組みになっています。

Migrationファイルの中身

生成されたファイルには、up()down() という2つのメソッドが用意されています。

<?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('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('body');
            $table->boolean('is_published')->default(false);
            $table->timestamps();
        });
    }

    /**
     * マイグレーションを元に戻す(テーブルを削除する)
     */
    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};

up() には「実行したときの処理」、down() には「元に戻すときの処理」を書きます。

Schema::create() の中でカラムを定義していく形が基本パターンです。

よく使うカラムの型

代表的なカラム型一覧

Migrationでよく使うカラム型をまとめておきます。

メソッド用途
$table->id()主キー(自動採番のbigint)
$table->string('name')文字列(デフォルト255文字まで)
$table->text('body')長文テキスト
$table->integer('count')整数
$table->boolean('is_active')真偽値(true/false)
$table->date('birthday')日付のみ
$table->timestamp('published_at')日時
$table->timestamps()created_atupdated_at を自動追加

カラムにオプションを付ける

各カラムには、メソッドチェーンで様々なオプションを追加できます。

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();          // 重複を禁止する
    $table->string('nickname')->nullable();      // NULLを許可する
    $table->integer('age')->default(20);          // デフォルト値を設定する
    $table->timestamps();
});

unique() はメールアドレスなど「重複させたくないカラム」に、nullable() は「入力必須ではないカラム」によく使います。

Migrationの実行とロールバック

テーブルを作成する

Migrationファイルを作成しただけでは、まだデータベースにテーブルは作られません。

次のコマンドを実行して、初めてテーブルが作成されます。

php artisan migrate

実行すると、database/migrations/ フォルダの中で「まだ実行していないファイル」だけが順番に処理されます。

変更を1つ前に戻す

テーブル定義を間違えたときは、直前のMigrationだけを取り消せます。

php artisan migrate:rollback

ファイルを修正した後、もう一度 php artisan migrate を実行すれば、修正した内容でテーブルが再作成されます。

開発中によく使う migrate:fresh

開発の初期段階では、テーブル構造を何度も試行錯誤することがよくあります。

そんなときは、全テーブルを一度削除してから作り直す migrate:fresh が便利です。

php artisan migrate:fresh

注意点として、このコマンドは既存のデータを全て消してしまいます。

本番環境や、他の人が触っているデータベースに対して絶対に実行しないよう、実行前に接続先の環境を必ず確認する習慣をつけましょう。

つまずきやすいポイント:既存テーブルへのカラム追加

create と table の使い分け

Migrationに慣れないうちによくある間違いが、既存のテーブルにカラムを追加するときの書き方です。

❌ Before:既存テーブルなのに Schema::create を使ってしまう

public function up(): void
{
    // postsテーブルはすでに存在するのに、create(新規作成)を使ってしまっている
    Schema::create('posts', function (Blueprint $table) {
        $table->string('thumbnail_url')->nullable();
    });
}

このコードを実行すると、「テーブルがすでに存在します」というエラーが発生します。

Schema::create は「新しくテーブルを作る」ためのメソッドなので、すでにあるテーブルに対して使うことはできません。

✅ After:既存テーブルへの変更は Schema::table を使う

public function up(): void
{
    Schema::table('posts', function (Blueprint $table) {
        $table->string('thumbnail_url')->nullable()->after('body');
    });
}

public function down(): void
{
    Schema::table('posts', function (Blueprint $table) {
        $table->dropColumn('thumbnail_url');
    });
}

既存テーブルにカラムを追加・変更するときは Schema::table、新しいテーブルを作るときは Schema::create という使い分けを覚えておきましょう。

カラム追加用のMigrationファイルは、次のように専用の名前で作成すると分かりやすくなります。

php artisan make:migration add_thumbnail_url_to_posts_table

まとめ

この記事のポイント

  • Migrationは、テーブル構造の変更履歴をPHPのコードとしてGitで共有できる仕組み
  • php artisan make:migration でファイルを作成し、up() に変更内容、down() に元に戻す処理を書く
  • php artisan migrate で実行、php artisan migrate:rollback で直前の変更を取り消せる
  • migrate:fresh は全データを消すため、実行環境を必ず確認してから使う
  • 新規テーブルは Schema::create、既存テーブルの変更は Schema::table を使い分ける

次に読むべき記事

テーブルの作り方が分かったところで、次はそのテーブルをPHPのコードから扱う「Eloquent」というORMについて解説します。

→ 次の記事:Eloquentとは?Laravelの顔ともいえるORMを理解する

タイトルとURLをコピーしました