こんにちは、かつコーチです。
前回まででルーティングとコントローラの基本的な応用を見てきました。
ここからはデータベース編に入っていきます。
最初のテーマは、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_at と updated_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を理解する