Laravelでマイグレーションをロールバック・再実行する方法をやさしく解説!
生徒
「Laravelでテーブルの構造を変更したいときに、マイグレーションをやり直す方法ってありますか?」
先生
「ありますよ。Laravelではマイグレーションをロールバック(取り消し)したり、再実行したりするコマンドが用意されています。」
生徒
「ロールバックって、どういう意味ですか?」
先生
「ロールバックとは、実行したマイグレーションを元の状態に戻すことです。つまり、テーブルを作る前の状態に戻す感じですね。それでは詳しく見ていきましょう!」
1. Laravelのマイグレーションとは?初心者向けに基礎を解説
Laravelのマイグレーション(Migration)とは、一言でいうと「データベースの設計図(バージョン管理)」のことです。通常、データベースのテーブルを作成するにはSQLという専門言語を書く必要がありますが、LaravelではPHPのコードを使って直感的にテーブル構造を作成・管理できます。
マイグレーションを使う最大のメリットは、チーム開発で「誰がどのカラムを追加したか」が明確になり、全員が同じデータベース構造を共有できる点にあります。まさにプログラムのソースコードと同じように、データベースの歴史を保存できる仕組みです。
マイグレーションファイルの簡単なサンプル
たとえば、新しく「投稿(posts)テーブル」を作りたい場合、以下のようなPHPファイル(マイグレーションファイル)を作成します。プログラミング未経験の方でも、なんとなく「どんな項目(カラム)を作ろうとしているか」がイメージできるはずです。
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id(); // 自動で増えるID番号
$table->string('title'); // 記事のタイトル(文字)
$table->text('content'); // 記事の本文(長い文章)
$table->timestamps(); // 作成日時と更新日時を自動記録
});
}
コマンドでテーブルを自動作成する
作成した設計図を実際のデータベースに反映させるには、ターミナルで以下のphp artisan migrateコマンドを実行します。これにより、手動で操作することなく瞬時にテーブルが構築されます。
php artisan migrate
実行すると、以下のような結果が表示され、データベースにテーブルが追加されたことがわかります。
INFO Preparing database.
Creating migration table ................................... 15ms DONE
Running migrations.
2026_01_01_000000_create_posts_table ....................... 30ms DONE
しかし、実際に開発を進めていると「タイトルの文字数を増やしたい」「カラム名を変更し忘れた」といったミスが発生することがあります。そんな時に役立つのが、今回詳しく解説するロールバック機能です。
2. マイグレーションをロールバックするとは?
ロールバックとは、直前に実行したマイグレーションを取り消して、データベースを以前の状態に戻すことを意味します。これは「一度実行したテーブル作成処理を取り消す」と考えるとわかりやすいでしょう。
たとえば、次のようにコマンドを実行します。
php artisan migrate:rollback
このコマンドを実行すると、直前のマイグレーション処理が取り消され、テーブルが削除されます。実際には、マイグレーションファイルに定義されたdown()メソッドの処理が実行されます。
もし複数回分を一度にロールバックしたい場合は、--stepオプションをつけます。
php artisan migrate:rollback --step=2
これで直近の2回分のマイグレーションを取り消すことができます。
3. すべてのマイグレーションを取り消す方法
全てのマイグレーションを一度に取り消したい場合は、次のコマンドを使います。
php artisan migrate:reset
このコマンドを実行すると、すべてのマイグレーションがロールバックされ、データベース内の全てのテーブルが削除されます。開発中に「一からやり直したい」ときに便利です。
4. ロールバック後に再実行する方法
マイグレーションをロールバックしたあとに、もう一度すべてのマイグレーションを実行したい場合は、次のコマンドを使います。
php artisan migrate:refresh
このコマンドは、次の2つの処理を自動で行います。
- ① すべてのマイグレーションをロールバック
- ② 再度すべてのマイグレーションを実行
つまり、データベースを一度まっさらな状態に戻して、最新のテーブル構造を再構築してくれます。
また、マイグレーションの実行と同時にSeeder(初期データ投入)を行いたい場合は、--seedオプションをつけます。
php artisan migrate:refresh --seed
これで、データベースの構造をリセットしながら、テストデータや初期データを再投入できます。
5. ロールバックとリフレッシュの違い
ここで、rollbackとrefreshの違いを整理しておきましょう。
| コマンド | 動作内容 |
|---|---|
php artisan migrate:rollback |
直前のマイグレーションだけを取り消す |
php artisan migrate:reset |
すべてのマイグレーションを取り消す |
php artisan migrate:refresh |
マイグレーションをすべてリセットして再実行する |
開発中に「一部の修正をやり直したい」ときはrollbackを、「全体をやり直したい」ときはrefreshを使うと覚えておくと便利です。
6. よくあるエラーと対処法
マイグレーションをロールバックや再実行するときに、次のようなエラーが出ることがあります。
Base table or view not found
これは、すでに削除されたテーブルを再度削除しようとしたときなどに発生します。その場合は、migrate:freshを使って、すべてのテーブルを削除してから再作成すると解決します。
php artisan migrate:fresh --seed
このコマンドは、既存のテーブルをすべて削除してから、新しい状態のマイグレーションを再実行します。開発中の初期化に最適です。
7. まとめ:マイグレーションをやり直して柔軟に開発しよう
Laravelのマイグレーションでは、rollbackやrefreshなどのコマンドを活用することで、データベースの構造を柔軟に調整できます。開発中は何度も試行錯誤することが多いので、これらのコマンドを使いこなせると非常に便利です。安全に変更を管理しながら、理想のデータベース設計を進めていきましょう。
まとめ
ここまで、Laravelにおけるマイグレーションのロールバックや再実行の手順について詳しく解説してきました。データベースの設計は、開発が進むにつれて「やっぱりカラム名を変えたい」「新しいテーブルとのリレーションを追加したい」といった変更が頻繁に発生するものです。そんな時、今回ご紹介したコマンドを自在に使いこなせるようになると、開発のスピードと柔軟性が格段に向上します。
マイグレーション管理の重要ポイント
Laravelのマイグレーションシステムが優れている点は、単に「テーブルを作る」だけでなく、「過去の状態に戻す」というバージョン管理のような仕組みを標準で備えていることです。
特に、開発チームで作業している場合、各自のローカル環境を最新の状態に保つためには、マイグレーションファイルの共有と実行が不可欠です。しかし、誰かがファイルを書き換えた際に、自分の環境とズレが生じてしまうこともあります。
そのような場合に、一度すべての構成をリセットして作り直す php artisan migrate:fresh などのコマンドは、トラブル解決の最短ルートとなります。
実践的なPHPコード例:マイグレーションファイルの構造
ロールバックが正常に動作するためには、マイグレーションファイル内の up() メソッドと down() メソッドが対になっている必要があります。
例えば、新しく「posts(投稿)」テーブルを作成する際の標準的なコードを見てみましょう。
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePostsTable extends Migration
{
/**
* マイグレーションの実行(テーブル作成)
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->timestamps();
});
}
/**
* マイグレーションのロールバック(テーブル削除)
*/
public function down()
{
Schema::dropIfExists('posts');
}
}
上記のコードにおいて、up() が実行されるのが php artisan migrate の時であり、逆に down() が実行されるのが php artisan migrate:rollback の時です。
もし down() メソッドを空のままにしてしまうと、ロールバックコマンドを実行してもテーブルが削除されず、エラーの原因となります。
「元に戻すための処理もセットで書く」という習慣をつけておくことが、Laravelエンジニアとしての第一歩です。
各コマンドの活用シーンと実行結果のイメージ
実際の開発現場でよく使われる流れを確認しておきましょう。 たとえば、直前の変更にミスがあったことに気づいた場合、次のようなコマンド操作を行います。
$ php artisan migrate:rollback
Rolling back: 2026_01_31_000000_create_posts_table
Rolled back: 2026_01_31_000000_create_posts_table
このように、どのファイルが元に戻されたかが明確に表示されます。 また、開発初期段階でテーブル定義を大幅に書き換えた際は、リフレッシュコマンドが非常に役立ちます。
$ php artisan migrate:refresh
Rolling back: 2026_01_31_100000_create_comments_table
Rolled back: 2026_01_31_100000_create_comments_table
Rolling back: 2026_01_31_000000_create_posts_table
Rolled back: 2026_01_31_000000_create_posts_table
Migrating: 2026_01_31_000000_create_posts_table
Migrated: 2026_01_31_000000_create_posts_table
Migrating: 2026_01_31_100000_create_comments_table
Migrated: 2026_01_31_100000_create_comments_table
一度すべてを壊して(Rolling back)、新しい定義で作り直す(Migrating)という一連の流れが自動で行われるのが分かりますね。 これが、Laravelが「データベース操作が非常に楽」と言われる大きな理由の一つです。
SEOと今後の学習のアドバイス
PHPやLaravelを学ぶ際、検索エンジンで「Laravel データベース 削除」「php artisan 戻す」といったキーワードで検索することが多いかと思います。
そうした時に、単にコマンドを丸暗記するのではなく、「なぜロールバックが必要なのか」「どういう仕組みで元に戻っているのか」を理解しておくと、応用力が身につきます。
特に migrate:fresh と migrate:refresh の違い(外部キー制約などの扱いや処理効率の差)などは、実戦で非常に役立つ知識です。
最後に、本記事の内容を意識してデータベース設計を行うことで、予期せぬエラーに遭遇しても慌てずに対処できるようになるはずです。 これからもマイグレーションコマンドをフル活用して、効率的でクリーンな開発環境を目指していきましょう。
生徒
「先生、今回の内容でマイグレーションの戻し方がバッチリ分かりました!今まで間違えた時は手動でデータベースをいじっていたので、コマンド一つで戻せるのは本当に感動です。」
先生
「それは良かったです!手動でデータベースを変更してしまうと、マイグレーションファイルとの整合性が取れなくなって、後で大きなトラブルになることが多いんです。だから、必ずコマンドを通すのがLaravelの鉄則ですよ。」
生徒
「なるほど…。あ、そういえば migrate:fresh と migrate:refresh って、結局どちらを使えばいいんでしょうか?どちらも似たような動きに見えますけど。」
先生
「いい質問ですね! refresh は各ファイルの down() メソッドを一つずつ実行して戻していきます。対して fresh は、既存のテーブルをドロップ(強制削除)してから up() を実行します。開発中でテーブル構造が複雑になり、ロールバックがうまく動かないような時は fresh の方が確実で早いことが多いですね。」
生徒
「使い分けが大事なんですね。あと、--seed オプションも便利そうです。テストデータを毎回入れ直す手間が省けますね。」
先生
「その通りです。特に初期データが必要なシステム開発では php artisan migrate:fresh --seed は魔法の呪文のように使いますよ(笑)。ただし、本番環境では絶対に使わないように注意してくださいね。データがすべて消えてしまいますから!」
生徒
「うわ、それは怖い…。本番では php artisan migrate だけにするように気をつけます!ありがとうございました!」