

などの疑問や悩みを解決してまいります。
マイグレーションは、データベースを操作する上でとても重要な機能です。
Laravelでデータベースを扱う場合マイグレーションは必ず使用するので、この記事でマイグレーションとは何たるか、また作成から実行、その他コマンドの使い方をしっかり理解していただけたらと思います。
本記事の目次
マイグレーションとは
Laravelのマイグレーションは、データベースの構造(テーブルやカラムなど)を管理し、変更するための仕組みです。
この機能を使うことで、データベースのスキーマ(設計図)をコードとして記録し、変更を簡単に追跡したり、チームで共有したりすることができます。


マイグレーションファイルの作成
マイグレーションファイルとは、データベースの構造(スキーマ)を管理するためのコードファイルで、テーブルの作成やカラムの追加・変更・削除など、データベースに対する操作を定義するものです。
マイグレーションファイルを作成するには以下のコマンドを実行します。
php artisan make:migration create_{テーブル名}_table例えば以下のコマンドを実行します。
php artisan make:migration create_tests_table成功すると以下のメッセージが表示され、database/migrations配下にマイグレーションファイルが作成されます。
![INFO Migration [database/migrations/2024_09_18_083620_create_tests_table.php] created successfully.](https://mitsutano-oshiro.com/wp-content/uploads/2024/09/a07eeed7da1c953b4795b6fc400f126d.png)
マイグレーションファイル名
マイグレーションファイル名は、作成年_作成月_作成日_作成時間_create_テーブル名_table.phpとなります。
つまり今回の例では、2024_09_18_083620_create_tests_table.phpとなります。
マイグレーションファイルの中身
それではマイグレーションファイルの中身を見ていきましょう。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('tests', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('tests');
}
};
up() メソッド
マイグレーションが実行時にup()メソッドが実行されます。
デフォルトの処理内容には、Schema::createメソッドがあります。
create()メソッド
第一引数:作成するテーブル名を指定します。今回はtestsテーブルを作成するので'tests'と記述します。
第二引数:テーブルカラムの設定する関数の処理内容を記述します。デフォルトではidとtimestamp(created_atとupdated_at)が設定されています。
今回はnameというカラムも追加しようと思いますので、コードに以下のように追記してください。
public function up(): void
{
Schema::create('tests', function (Blueprint $table) {
$table->id();
$table->string('name', 20); // 追加カラム
$table->timestamps();
});
}このマイグレーションファイルを実行するとidとcreated_at、updated_at、そして追加したnameのカラムを持つtestsテーブルがデータベースに作成されます。
down() メソッド
マイグレーションのロールバック実行時にdown()メソッドが実行されます。
down() メソッド(ロールバック)は、up() メソッドで行った変更を元に戻すことができます。

マイグレーションの実行
マイグレーションファイルの準備が出来ましたら、マイグレーションを以下コマンドで実行します。
php artisan migrateこのコマンドを実行することで、未実行のマイグレーションファイルを上から順に実行していきます。
実行して以下のメッセージが表示されればOKです。

またマイグレーションファイルを個別に実行していきたい場合は以下のコマンドで実行するファイル名を指定します。
php artisan migrate --path=/database/migrations/{マイグレーションファイル名}.phpこれでデータベースを確認してみると、testsテーブルが作成されているはずです。
マイグレーションのロールバック
down() メソッドの紹介でも少し説明しましたが、ロールバックはup() メソッドで行った変更を元に戻すことができます。
例えば先程作成したtestsテーブルを、作成する前に戻すことができるということです。
以下のコマンドを実行することでマイグレーションを1つ前の状態に戻すことができます。
php artisan migrate:rollbackこちらもマイグレーション実行時と同様に個別のファイルをロールバック実行したい場合は、ファイル名を指定します。
php artisan migrate:rollback --path=/database/migrations/{マイグレーションファイル名}.phpこれでtestsテーブルがデータベースからなくなっているはずです。
また特定のマイグレーションまで戻したい場合は、--stepオプションで指定した数だけマイグレーションを戻すことが可能です。
php artisan migrate:rollback --step=2マイグレーションの主なコマンド
次にマイグレーションに関する基本的なコマンドをいくつか紹介します。
migrate:status
以下のコマンドで、マイグレーションファイルの状態を確認することができます。
php artisan migrate:statusするとすべてのマイグレーションファイルの状態確認ができます。
Ranとなっていれば実行済みのファイルで、Pendingとなっていれば未実行のファイルであることが分かります。


migrate:freshとmigrate:refresh
どちらともデータベースの状態をリセットし、最新のマイグレーションを適用するために使われますが、それぞれの動作に違いがあります。
migrate:freshは、データベースの全テーブルを削除してから、すべてのマイグレーションを最初から再実行します。
php artisan migrate:freshそのため、データベースをリセットして最新な状態からスタートさせることができますが、マイグレーションの管理外のテーブルも削除することになるのでコマンドの実行には注意が必要です。

一方のmigrate:refreshは、既に実行されているマイグレーションを全てロールバックし、その後再度すべてのマイグレーションを実行します。
php artisan migrate:refreshmigrate:freshと違い、すべてのテーブルが削除されるのではなく、既存のデータベース構造を変更することなく更新することができます。

migrate:refreshでは、マイグレーションの履歴は削除されないので覚えておいてください!| 機能 | migrate:fresh | migrate:refresh |
|---|---|---|
| 動作内容 | 全テーブルを削除してから再マイグレート | マイグレーションをロールバックして再実行 |
| データの消失 | 全テーブルのデータが削除 | ロールバックによりデータが失われることがある |
| 使用目的 | クリーンな状態でデータベースを再構築したい時 | マイグレーションをロールバックして再実行 |
| リセット方法 | テーブルを一から削除して再作成 | マイグレーションを適用して戻す |
| データ履歴 | 削除 | 保持 |
migrate:reset
migrate:resetは、すべてのマイグレーションをロールバックするコマンドです。
migrate:resetすべてのマイグレーションがロールバックされるため、マイグレーションが実行される前、つまり初期状態に戻ります。

migrate:refreshのマイグレーションが実行されない版ですかね。まとめ
Laravelのマイグレーションは、データベースの変更や管理を効率的に行うための便利な機能です。
基本的なコマンドを使いこなすことで、テーブルの作成や修正、ロールバックが簡単に実行することができますので、この記事でマイグレーションを理解し、今後のアプリ開発において参考にしていただけると幸いです。