Laravelでマイグレーションファイルを作成する方法を徹底解説!初心者でもわかるmake:migrationの使い方
生徒
「先生、Laravelでデータベースのテーブルを作るときって、どうやって設定するんですか?」
先生
「いい質問ですね。Laravelでは、マイグレーション(Migration)という仕組みを使って、データベースの構造をプログラムで管理できるんです。」
生徒
「プログラムでデータベースを作るんですか?SQLを手で書かなくてもいいんですか?」
先生
「その通りです!Laravelのmake:migrationコマンドを使えば、テーブルを作るためのファイルを自動で作成できます。それでは具体的に見ていきましょう!」
1. マイグレーションとは?データベースの「家系図」と「設計書」
Laravelのマイグレーション(Migration)とは、一言で言うと「データベースの構造をプログラムのコードで作成・管理する仕組み」のことです。通常、データベースを作るには「SQL」という専用の言語を学ぶ必要がありますが、マイグレーションを使えば、PHPのコードを書くだけでテーブルの作成や変更が可能になります。
マイグレーションの役割は、大きく分けて2つあります。
- データベースの設計書: どんな名前のテーブルに、どんな情報を入れる箱(カラム)を作るかを定義します。
- データベースの変更履歴: 「いつ、誰が、どの項目を追加したか」という履歴を保存します。これにより、過去の状態に簡単に戻したり(ロールバック)、別のパソコンで全く同じデータベースを再現したりできます。
マイグレーションは、スマートフォンの「OSアップデート」に似ています。
- Ver 1.0: 「名前」と「電話番号」を保存する機能を作る。
- Ver 1.1: 「メールアドレス」を保存する機能を追加する。
例えば、未経験の方でも直感的に理解できる「自己紹介テーブル」を作るためのイメージコードを見てみましょう。
// このコードを実行するだけで、データベースに「自己紹介テーブル」が自動生成されます
Schema::create('profiles', function (Blueprint $table) {
$table->id(); // ID(自動で番号が振られる)
$table->string('nickname'); // ニックネームを保存する箱
$table->text('bio'); // 自己紹介文を保存する広い箱
$table->timestamps(); // 作成した日時を自動記録する
});
このように、SQL文を一行も書かずに「どんなデータが欲しいか」を日本語に近い感覚で指示できるのが、Laravelマイグレーションの最大のメリットです。チーム開発でも「このファイルを実行して!」と伝えるだけで、全員が同じデータベース構造を共有できるため、現代のWeb開発には欠かせない技術となっています。
2. マイグレーションファイルの作成コマンドと命名のルール
Laravelでデータベースの設計図(テーブル)を作成するには、まず「マイグレーションファイル」という専用のファイルを用意する必要があります。このファイルは手動で作るのではなく、VSCodeなどのターミナル(コマンドプロンプト)から、以下のArtisanコマンドを入力して自動生成するのが基本です。
基本的な作成コマンド
例えば、「users(ユーザー)」という名前のテーブルを新しく作りたい場合は、次のように入力します。
php artisan make:migration create_users_table
このコマンドを実行すると、database/migrationsフォルダの中に、新しいPHPファイルが作成されます。プログラミング未経験の方でも、この1行をコピー&ペーストして実行するだけで準備が整うので安心してください。
生成されるファイル名の仕組み
実際に作成されたファイルを確認してみると、次のような名前になっています。
2026_02_01_000000_create_users_table.php
ここで注目したいのは、ファイル名の先頭にある「2026_02_01_000000」という数字です。これはファイルが作成された「年・月・日・時刻」を表しています。
Googleの検索エンジンでも「Laravel マイグレーション 順序」といったキーワードでよく調べられますが、Laravelはこのタイムスタンプ(作成日時)を見て、どの順番でテーブルを作成するかを自動的に判断しています。そのため、ファイル名の数字部分を自分で書き換えるとエラーの原因になることもあるので、そのままにしておきましょう。
テーブルを作るときは
create_テーブル名_table という形式でコマンドを打つのが慣例です。これに従うことで、Laravelが「あ、これは新しいテーブルを作るためのプログラムだな」と自動的に中身を予測してコードを書き込んでくれます。
3. 作成されるファイルの構造を理解しよう
生成されたマイグレーションファイルを開くと、PHPのクラスという形式でコードが記述されています。最初は難しく見えるかもしれませんが、基本的には「設計図の指示書」だと考えれば大丈夫です。主に使うのは 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
{
// 'users'という名前のテーブルを作成する指示
Schema::create('users', function (Blueprint $table) {
$table->id(); // 自動で増えるID番号の列
$table->string('name'); // 名前を保存する列
$table->string('email')->unique(); // メアドを保存する列(重複禁止)
$table->timestamps(); // 作成日時と更新日時を自動記録する列
});
}
/**
* マイグレーションの取り消し(テーブルの削除)
*/
public function down(): void
{
// もし'users'テーブルが存在すれば削除する指示
Schema::dropIfExists('users');
}
};
up()メソッド:テーブルを作る指示
ここでは「どんな名前のテーブルを作り、どんな情報を入れる箱(カラム)を用意するか」を定義します。例えば $table->string('name') は「名前を入れるための文字列の箱を作ってね」という命令です。プログラミング未経験の方でも、この一行一行が「名簿の項目」を増やしているイメージを持つと分かりやすいでしょう。
down()メソッド:元に戻す指示
「やっぱり今の操作をやめたい!」と思った時に実行される、いわば「消しゴム」の役割です。up() で作成したテーブルを削除する処理を書いておくことで、データベースの状態を安全に以前の状態へ巻き戻す(ロールバック)ことが可能になります。
このように、Laravelでは「作成」と「削除」の指示をセットで管理するため、チーム開発でもデータベースの構成を常に正しく共有できる仕組みになっています。
4. テーブル名とファイル名の関係:命名規則の重要性
Laravelでマイグレーションファイルを生成する際、php artisan make:migrationコマンドに渡す「引数(名前)」には、実は魔法のようなルールがあります。最も一般的で推奨されるのが、「create_テーブル名_table」という形式です。
例えば、ブログの投稿を保存する「posts」というテーブルを作りたい場合、以下のようなコマンドを入力します。
php artisan make:migration create_posts_table
この命名規則を守る最大のメリットは、Laravelが「あ、これは新しいテーブルを作るんだな」と自動で判断してくれる点にあります。このルールに沿って作成すると、生成されたファイルの中身(PHPコード)に、最初からテーブル作成用の枠組みが自動入力されます。
プログラミング未経験の方でも分かりやすいよう、実際のファイルの中身をイメージしてみましょう。上記のコマンドを実行すると、Laravelは以下のようなコードを自動で準備してくれます。
Schema::create('posts', function (Blueprint $table) {
$table->id(); // 自動的に連番を振るID
$table->timestamps(); // 作成日時と更新日時を自動記録
});
もし、この命名規則を無視して適当な名前(例えば make_new_data など)でファイルを作ってしまうと、上記の Schema::create('posts', ...) という重要な部分が書き込まれず、空っぽのファイルになってしまいます。そうなると、初心者のうちは「何を書いていいか分からない」という壁にぶつかってしまうため、まずはこの「create_◯◯_table」という定型文をセットで覚えるのが、開発効率を上げる一番の近道です。
ファイル名の先頭には実行した日時が自動で付与されるため、ファイルが作られた順番がひと目で分かる仕組みになっています。これにより、チーム開発でも混乱せずにデータベースの管理ができるようになります。
5. カラムを追加するマイグレーションを作る
既存のテーブルに新しいカラムを追加したい場合は、次のように作成します。
php artisan make:migration add_profile_to_users_table --table=users
--table=usersオプションを付けることで、「users」テーブルを編集するマイグレーションファイルが生成されます。
ファイルを開くと、Schema::table()メソッドを使ってカラムを追加できるようになっています。
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('profile')->nullable();
});
}
6. 複数のマイグレーションを使い分けるコツ
Laravelのマイグレーションでは、1つのファイルにすべてのテーブルをまとめるのではなく、「1テーブル1ファイル」で管理するのがベストです。これにより、どの変更がどこで行われたかを簡単に把握でき、将来的な修正やチーム開発もスムーズになります。
また、マイグレーションファイルはバージョン管理(Gitなど)と組み合わせて利用することで、チーム全員が同じデータベース構造を再現できるという利点があります。
7. まとめ:make:migrationで効率的に開発しよう
make:migrationコマンドを活用すれば、SQLの知識がなくてもLaravel内で簡単にデータベース設計ができます。データベースの変更もコードとして管理できるため、安心して試行錯誤できるのが大きな魅力です。
Laravelを使った開発では、マイグレーションを正しく使いこなすことが、効率的で安全なデータベース管理の第一歩です。
まとめ
ここまで、Laravelにおけるマイグレーションの基本から、具体的なファイルの作成方法、そしてテーブルの構造定義やカラム追加の手順について詳しく解説してきました。マイグレーションは単にデータベースを構築するためのツールではなく、プロジェクトの成長を支える「設計図の履歴」そのものです。PHP Artisanコマンド一つで正確なファイルを生成し、バージョン管理システムと組み合わせることで、複数人でのチーム開発においても環境の差異をなくし、スムーズな連携が可能になります。
マイグレーション運用の重要ポイント
実際のプロジェクト運用では、一度本番環境に反映したマイグレーションファイルを直接編集してはいけません。構造を変更したい場合は、必ず新しいマイグレーションファイルを作成して「変更を加える」というスタンスが重要です。これにより、データベースの状態がどの時点のコードに対応しているかが明確になり、トラブル時の原因究明も容易になります。また、php artisan migrateを実行する前に、記述内容に誤りがないか再確認する癖をつけることで、不要なロールバック作業を減らすことができます。
実践的なカラム定義のバリエーション
マイグレーションファイル内では、データ型に応じた多様なメソッドが用意されています。例えば、真偽値を扱うbooleanや、大きなテキストデータを扱うtext、日付を管理するdateTimeなど、適切に使い分けることで最適なデータベース設計が可能になります。
Schema::create('articles', function (Blueprint $table) {
$table->id(); // 自動インクリメントの主キー
$table->string('title', 100); // 100文字制限の文字列カラム
$table->text('content'); // 長文テキスト用
$table->boolean('is_published')->default(false); // デフォルト値を設定
$table->integer('view_count')->unsigned()->default(0); // 符号なし整数
$table->foreignId('user_id')->constrained(); // 外部キー制約の追加
$table->timestamps(); // created_atとupdated_atを自動生成
});
上記のように、オプションとして->default()や->nullable()を連結することで、カラムに詳細な制約を与えることができます。これにより、データベースレベルでの整合性を保つことができ、アプリケーションの堅牢性が向上します。
マイグレーションの実行と状態確認
ファイルを作成・編集した後は、忘れずに実行コマンドを入力しましょう。現在、どのマイグレーションが実行済みかを確認するには、ステータス確認コマンドが便利です。
// 作成したマイグレーションを反映する
php artisan migrate
// 現在のマイグレーション実行状況を確認する
php artisan migrate:status
実行結果の画面では、各ファイルが「Ran(実行済み)」か「No(未実行)」かが一覧で表示されます。開発中に「あれ、あのテーブル作ったかな?」と迷ったときは、まずこのコマンドで現在の状態をチェックするようにしましょう。
+------+-------------------------------------------------------+-------+
| Ran? | Migration | Batch |
+------+-------------------------------------------------------+-------+
| Yes | 2014_10_12_000000_create_users_table | 1 |
| Yes | 2014_10_12_100000_create_password_reset_tokens_table | 1 |
| No | 2026_01_31_100000_create_articles_table | |
+------+-------------------------------------------------------+-------+
よく使うロールバックコマンドの使い分け
開発を進めていると、直前の変更を取り消したい場面が多々あります。Laravelには柔軟なロールバック機能が備わっています。
- rollback: 直前のマイグレーション作業(バッチ単位)を元に戻します。
- reset: 全てのマイグレーションを元に戻し、テーブルを空にします。
- refresh: 全てのマイグレーションを戻した後、再度最初から実行します。テーブルを作り直したい時に便利です。
// 直前の操作を1ステップだけ戻す
php artisan migrate:rollback --step=1
// 全て作り直す(データの全消去に注意!)
php artisan migrate:refresh
今後の学習ステップ
マイグレーションの基本をマスターしたら、次は「シーダー(Seeder)」や「ファクトリ(Factory)」についても学んでみてください。マイグレーションで作ったテーブルに、テスト用のデータを自動で流し込むことができるようになります。これにより、手動でテストデータを登録する手間が省け、より効率的な開発サイクルを回せるようになるはずです。
Laravelの強力な機能を使いこなし、スマートなバックエンド開発を目指していきましょう!
生徒
「先生、ありがとうございました!マイグレーションって単にテーブルを作るだけじゃなくて、履歴として管理できるのがすごく便利ですね。Gitみたいです。」
先生
「まさにその通り!データベースのバージョン管理システムだと考えると分かりやすいでしょう。複数人で開発していても、『誰がどのカラムを追加したか』がコードを見れば一目瞭然ですからね。」
生徒
「もし、間違えてphp artisan migrateしちゃった時は、焦らずにrollbackすればいいんですね。でも、本番環境で使うときはちょっとドキドキしそうです。」
先生
「そうですね。本番環境で実行する前には、必ずローカルやテスト環境で動作確認をすることが鉄則です。あと、データの入っているカラムを削除するようなマイグレーションを書くときは、バックアップを忘れずに!」
生徒
「わかりました!あ、もう一つ質問なんですが、カラムの順番って変えられますか?」
先生
「いいところに気づきましたね。MySQLなどを使っている場合は、->after('column_name')というメソッドを使えば、特定のカラムの後ろに追加することができますよ。例えばこんな感じです。」
$table->string('phone_number')->after('email');
生徒
「なるほど、細かい調整もPHPのコードだけで完結するんですね。SQLを直接叩く機会が本当に減りそうです!」
先生
「それがフレームワークを使う大きなメリットの一つですからね。まずは簡単なテーブル作成から始めて、少しずつ複雑なリレーションの設定などにも挑戦してみましょう。頑張ってくださいね!」
生徒
「はい、まずは自分のブログアプリのデータベースをマイグレーションで設計し直してみます!」