make:migration — マイグレーションファイルを作成するコマンド
artisan
- カテゴリ:artisan
- 掲載バージョン:Laravel 12・PHP 8.4
- 名前空間 / FQCN / コマンド:
php artisan make:migration
- 関連:make:model, make:controller, make:seeder, migrate, migrate:rollback
- 変更履歴:1.0 初期導入 → 8.x で
--create / --table オプション追加
要点(TL;DR)
- データベーススキーマ変更をコード化したマイグレーションファイルを生成
- 最小構成:
php artisan make:migration create_users_table
- よくある罠
- 名前は
snake_case で付けないとエラー
--create を忘れると $table が未定義になる
- 既存ファイルと同名で作成しようとすると上書き防止エラー
概要
make:migration は database/migrations ディレクトリにマイグレーションクラスを生成します。
名前は自動的にタイムスタンプ付きで登録され、php artisan migrate で実行可能です。
プロジェクトのスキーマ変更をコード化し、バージョン管理できます。
構文 / シグネチャ
php artisan make:migration [name] [options]
引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|
| name | string | ✔︎ | なし | マイグレーションファイル名(例: create_users_table) |
オプション(表)
| オプション | 型 | 必須 | 既定値 | 説明 |
|---|
--create | string | ❌ | なし | up() で $table->create() を呼び出すテーブル名 |
--table | string | ❌ | なし | 既存テーブルに対して up()/down() を定義 |
--path | string | ❌ | なし | カスタムディレクトリへのパス |
--realpath | bool | ❌ | false | --path で実際のパスを指定 |
--force | bool | ❌ | false | 既存ファイルがある場合でも上書き |
戻り値
- 型:
int(0 は成功、1 は失敗)
- 意味: Artisan コマンドの終了コード。標準出力に作成ファイル名が表示される。
例外 / 副作用
InvalidArgumentException – name が空の場合
FileExistsException – 同名ファイルが既に存在し、--force が無い場合
- ファイル生成時にディレクトリが無いと
Illuminate\Contracts\Filesystem\FileNotFoundException
使用例
最小例
php artisan make:migration create_users_table
実務例(テーブル作成)
php artisan make:migration create_users_table --create=users
これにより、up() で $table->create() が呼ばれ、down() で $table->dropIfExists('users') が自動生成されます。
よくある落とし穴・注意
| 症状/エラー | 原因 | 対処 |
|---|
Target migration already exists | 同名ファイルが存在 | --force を付けて上書き、または別名に変更 |
Could not find migration class | クラス名とファイル名が不一致 | php artisan make:migration を再実行し、ファイル名を修正 |
$table が未定義 | --create/--table を忘れた | 選択したオプションに応じて付与 |
代替・関連APIとの比較
| ユーザーケース | 推奨手段 | 理由 |
|---|
| テーブルを新規作成 | make:migration --create=table | $table->create() が自動生成 |
| 既存テーブルを変更 | make:migration(オプションなし) | 手動で $table を利用 |
| 直接ファイル編集 | 手動で database/migrations/*.php 作成 | コマンド使用時の誤入力を防ぎたい |
テスト例(Pest)
it('creates a migration file', function () {
Artisan::call('make:migration', [
'name' => 'create_test_table',
'--create' => 'test',
]);
$output = Artisan::output();
// `output` は "database/migrations/xxxxxx_create_test_table.php" のパス
$path = database_path('migrations/' . preg_match('/(.*)\.php$/', $output, $m) ? $m[1] : $output);
expect(file_exists($path))->toBeTrue();
});
参考リンク