Laravelのマイグレーション構文まとめ!table・column・indexをやさしく解説
生徒
「Laravelでデータベースのテーブルを作るとき、どんな書き方をするんですか?」
先生
「Laravelでは『マイグレーション』という仕組みを使って、データベースの構造をコードで管理できるんです。」
生徒
「マイグレーションって難しそうですね…どんな構文を覚えればいいんですか?」
先生
「大丈夫。基本の構文を覚えれば誰でもできます。今日は『table』『column』『index』の3つを中心に解説しますね!」
1. マイグレーションとは?(データベースの家系図・設計図)
マイグレーション(Migration)とは、一言でいうと「データベースのバージョン管理システム」のことです。プログラミング初心者の方には、「データベースの設計図をPHPのコードで記録したもの」と考えると分かりやすいでしょう。
通常、データベースのテーブルを作るには「SQL」という専用の言語を学ぶ必要があります。しかし、Laravelのマイグレーションを使えば、PHPの知識だけで「どんな項目(名前やメールアドレスなど)が必要か」を自由に定義できます。これにより、初心者でもミスなくデータベースを構築できるようになります。
もしあなたがチームで開発をしていて、自分のパソコンのデータベースだけを書き換えても、他のメンバーのパソコンにはその変更が伝わりません。マイグレーションファイル(設計図)を共有すれば、コマンド一つで全員が「全く同じデータベース構造」を再現できるのです。これは、大規模なWebサービス開発において必須のスキルといえます。
例えば、「ユーザー(users)テーブル」を作るためのごく簡単なイメージは以下の通りです。
// これが「設計図(マイグレーション)」のイメージです
Schema::create('users', function (Blueprint $table) {
$table->id(); // 自動で増える番号(ID)
$table->string('name'); // 名前を入れる場所
$table->timestamps(); // 作った日時を自動記録
});
このように、直感的なコードでデータベースの状態を「過去から現在まで」記録・管理できるのがマイグレーション最大のメリットです。
2. マイグレーションファイルを作る方法
マイグレーションファイルは、ターミナル(黒い画面)で下記のコマンドを実行して作成します。
php artisan make:migration create_users_table
このコマンドを実行すると、database/migrations フォルダに新しいファイルが作成されます。ファイル名には作成日時が付き、どの順番で作られたかもわかるようになっています。
3. table構文(テーブル定義)
マイグレーションの中では、Schema::create() を使ってテーブルを作成します。Schema(スキーマ)は、Laravelが提供するデータベース構造を扱うクラスです。
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('users', function (Blueprint $table) {
$table->id(); // 主キー
$table->string('name'); // 名前カラム
$table->string('email')->unique(); // メールアドレス(重複不可)
$table->timestamps(); // created_atとupdated_at
});
}
public function down(): void {
Schema::dropIfExists('users');
}
};
このようにBlueprintクラスを使って、テーブルやカラム(列)を柔軟に定義できます。
4. column構文(カラム定義)
カラムとは、テーブルの「列」のことです。ユーザー情報であれば「名前」「メールアドレス」「年齢」などがカラムになります。
Laravelではさまざまな型のカラムを定義できます。代表的なものを一覧で見てみましょう。
$table->string('name');:文字列を保存するカラム$table->integer('age');:整数値(数)を保存$table->boolean('is_active');:真偽値(true/false)を保存$table->date('birthday');:日付を保存$table->text('profile');:長文のテキストを保存
たとえば、ユーザーのプロフィール情報を管理するテーブルを作る例は次のようになります。
Schema::create('profiles', function (Blueprint $table) {
$table->id();
$table->string('nickname', 50);
$table->text('bio')->nullable(); // nullを許可
$table->integer('age')->default(0); // 初期値を設定
$table->timestamps();
});
5. index構文(インデックスの設定)
インデックス(index)とは、データ検索を高速化するための仕組みです。たとえばユーザーのメールアドレスで検索する場合、インデックスを付けると検索がスピードアップします。
Laravelでは次のように簡単にインデックスを追加できます。
$table->index('email'); // 通常のインデックス
$table->unique('email'); // 一意制約付きインデックス
$table->primary('id'); // 主キー(通常はidに自動付与される)
これらを組み合わせて、検索や重複チェックが効率的に行えるテーブルを設計できます。
6. テーブルの変更と削除
既にあるテーブルにカラムを追加したいときは、Schema::table()を使います。
Schema::table('users', function (Blueprint $table) {
$table->string('phone')->nullable();
});
逆に、テーブルやカラムを削除したいときは以下のように書きます。
Schema::dropIfExists('profiles'); // テーブル削除
$table->dropColumn('phone'); // カラム削除
7. マイグレーションの実行と取り消し
定義したマイグレーションを実際に反映するには、次のコマンドを実行します。
php artisan migrate
もし間違えた場合ややり直したい場合は、下記のコマンドで取り消せます。
php artisan migrate:rollback
これにより、テーブルを安全に管理しながらデータベース構造を進化させることができます。
8. よく使うマイグレーション構文まとめ
Laravelで頻繁に使うマイグレーション構文をまとめると、次のようになります。
Schema::create():テーブルを作成Schema::table():既存テーブルを変更Schema::dropIfExists():テーブル削除$table->string():文字列型カラム$table->integer():数値型カラム$table->timestamps():日時カラム(自動)$table->unique():一意制約インデックス$table->nullable():NULLを許可$table->default():初期値設定
これらを理解しておくと、Laravelでのデータベース設計がぐっと楽になります。
まとめ
ここまでLaravelのマイグレーションにおける基本的な構文から、具体的なテーブル作成、カラム定義、インデックスの設定方法まで詳しく解説してきました。マイグレーションは、単にデータベースにテーブルを作るための作業ではありません。チーム開発において「誰が、いつ、どのような意図でデータベースを変更したか」をコードとして記録し、共有するための非常に重要なツールです。
マイグレーションを使いこなすためのポイント
Laravelのマイグレーションを効率的に運用するためには、基礎的なメソッドの役割をしっかりと把握しておくことが近道です。特に「Schema」クラスの役割と、「Blueprint」を使ったカラム定義のバリエーションを理解することで、複雑なデータ構造もスムーズに構築できるようになります。
実践的なサンプルコード:応用編
これまでに学んだ内容を組み合わせて、実戦でよく使われる「商品管理テーブル(products)」のマイグレーションファイルを想定したコードを書いてみましょう。ここでは、数値型、文字列型、外部キー、そしてインデックスの設定を盛り込んでいます。
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('products', function (Blueprint $table) {
$table->id(); // 自動採番のID
$table->string('product_code')->unique(); // 商品コード(重複不可・ユニークインデックス)
$table->string('name', 255); // 商品名
$table->text('description')->nullable(); // 詳細説明(空でもOK)
$table->integer('price')->unsigned()->default(0); // 価格(正の整数・初期値0)
$table->integer('stock_quantity')->default(0); // 在庫数
$table->boolean('is_visible')->default(true); // 公開フラグ
$table->unsignedBigInteger('category_id'); // カテゴリID(外部キー用)
// インデックスの付与
$table->index('category_id');
$table->index(['name', 'price']); // 複合インデックス
$table->timestamps(); // 作成日・更新日
});
}
/**
* マイグレーションの取り消し
*/
public function down(): void {
Schema::dropIfExists('products');
}
};
データ型の使い分けと修飾子の活用
Laravelでは、string以外にも多くのデータ型が用意されています。例えば、金額を扱う場合はdecimal型、非常に長いテキストを扱う場合はlongText型など、データの性質に合わせて最適な型を選ぶことが、データベースのパフォーマンス向上に繋がります。
また、nullable()やdefault()といった「カラム修飾子」を使いこなすことで、プログラム側でのバリデーション負荷を軽減し、データの整合性を保つことができます。
Schema::table('users', function (Blueprint $table) {
// 既存のテーブルに新しいカラムを追加する例
$table->string('middle_name')->after('name')->nullable(); // nameカラムの後ろに追加
$table->string('status')->default('active')->comment('ユーザーの状態'); // コメント付き
});
マイグレーション実行時の注意点
実務において最も気をつけたいのが、本番環境でのマイグレーションです。すでにデータが入っているテーブルのカラムを削除したり、データ型を変更したりすると、データが消えてしまうリスクがあります。
変更を行う際は、必ず php artisan migrate --pretend コマンドを使って、実際に発行されるSQLを確認する癖をつけると良いでしょう。
コマンドラインでの実行結果は通常、以下のように表示されます。
INFO Preparing database.
INFO Running migrations.
2026_01_31_100000_create_products_table ........................................... 45ms DONE
最後に
Laravelのマイグレーション構文は、PHPのスキルに関わらず、直感的に読み書きできるように設計されています。ドキュメントを片手に何度もコードを書き、実際にデータベースがどう変化するかを確認することで、自然と身についていくはずです。設計図としてのマイグレーションをマスターして、堅牢でメンテナンス性の高いアプリケーション開発を目指しましょう。
生徒
「先生、まとめまで読んでみて、マイグレーションが単なる設定ファイル以上の役割を持っていることがよくわかりました!特に、チームで開発するときに『このカラム、いつ追加したっけ?』とならないのがいいですね。」
先生
「その通りです!履歴管理(バージョン管理)ができるのが最大のメリットですね。サンプルコードに書いた unique() や index() の使い方は理解できましたか?」
生徒
「はい!unique() を使うと、メールアドレスみたいに重複しちゃいけないデータを守れるんですよね。あと、検索を早くするために index() を貼るというのも勉強になりました。でも、全部のカラムにインデックスを貼っちゃってもいいんですか?」
先生
「おっと、そこは注意が必要です。インデックスは検索を速くしてくれますが、逆にデータの登録(挿入)や更新のスピードを少し落としてしまう性質があるんです。なので、よく検索の条件に使うカラムに絞って設定するのがコツですよ。」
生徒
「なるほど、何でもかんでもつければいいわけじゃないんですね。バランスが大事なんだ。あと、途中でカラムを足したくなったときは、既存のマイグレーションファイルを書き換えるんじゃなくて、新しくファイルを作るのが正解ですか?」
先生
「鋭いですね!すでに php artisan migrate で実行済みのファイルを書き換えても、基本的には反映されません。新しいマイグレーションファイルを作って Schema::table() で変更を加えるのが、Laravelの王道のやり方です。開発中なら migrate:fresh で全部作り直すこともありますけどね。」
生徒
「migrate:fresh ですか。中身が全部消えちゃうから、本番で使うときは要注意のコマンドですね(笑)。コマンドを実行した時の DONE っていう表示を見ると、なんだか達成感があります!」
先生
「その達成感はエンジニアにとって大切ですよ。PHPのコードが実際のデータベースの形に変わっていく様子を楽しみながら、色々なテーブル設計に挑戦してみてくださいね。次は外部キー制約(Foreign Key)についても詳しく見ていきましょうか!」
生徒
「はい、楽しみです!もっと複雑な関連性もコードで書けるようになりたいです。ありがとうございました!」