カテゴリ: Laravel 更新日: 2026/02/22

Laravelでマイグレーションをロールバック・再実行する方法をやさしく解説!

Laravelでマイグレーションをロールバック・再実行する方法
Laravelでマイグレーションをロールバック・再実行する方法

先生と生徒の会話形式で理解しよう

生徒

「Laravelでテーブルの構造を変更したいときに、マイグレーションをやり直す方法ってありますか?」

先生

「ありますよ。Laravelではマイグレーションをロールバック(取り消し)したり、再実行したりするコマンドが用意されています。」

生徒

「ロールバックって、どういう意味ですか?」

先生

「ロールバックとは、実行したマイグレーションを元の状態に戻すことです。つまり、テーブルを作る前の状態に戻す感じですね。それでは詳しく見ていきましょう!」

1. Laravelのマイグレーションとは?初心者向けに基礎を解説

1. 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. マイグレーションをロールバックするとは?

2. マイグレーションをロールバックするとは?
2. マイグレーションをロールバックするとは?

ロールバックとは、直前に実行したマイグレーションを取り消して、データベースを以前の状態に戻すことを意味します。これは「一度実行したテーブル作成処理を取り消す」と考えるとわかりやすいでしょう。

たとえば、次のようにコマンドを実行します。


php artisan migrate:rollback

このコマンドを実行すると、直前のマイグレーション処理が取り消され、テーブルが削除されます。実際には、マイグレーションファイルに定義されたdown()メソッドの処理が実行されます。

もし複数回分を一度にロールバックしたい場合は、--stepオプションをつけます。


php artisan migrate:rollback --step=2

これで直近の2回分のマイグレーションを取り消すことができます。

3. すべてのマイグレーションを取り消す方法

3. すべてのマイグレーションを取り消す方法
3. すべてのマイグレーションを取り消す方法

全てのマイグレーションを一度に取り消したい場合は、次のコマンドを使います。


php artisan migrate:reset

このコマンドを実行すると、すべてのマイグレーションがロールバックされ、データベース内の全てのテーブルが削除されます。開発中に「一からやり直したい」ときに便利です。

4. ロールバック後に再実行する方法

4. ロールバック後に再実行する方法
4. ロールバック後に再実行する方法

マイグレーションをロールバックしたあとに、もう一度すべてのマイグレーションを実行したい場合は、次のコマンドを使います。


php artisan migrate:refresh

このコマンドは、次の2つの処理を自動で行います。

  • ① すべてのマイグレーションをロールバック
  • ② 再度すべてのマイグレーションを実行

つまり、データベースを一度まっさらな状態に戻して、最新のテーブル構造を再構築してくれます。

また、マイグレーションの実行と同時にSeeder(初期データ投入)を行いたい場合は、--seedオプションをつけます。


php artisan migrate:refresh --seed

これで、データベースの構造をリセットしながら、テストデータや初期データを再投入できます。

5. ロールバックとリフレッシュの違い

5. ロールバックとリフレッシュの違い
5. ロールバックとリフレッシュの違い

ここで、rollbackrefreshの違いを整理しておきましょう。

コマンド 動作内容
php artisan migrate:rollback 直前のマイグレーションだけを取り消す
php artisan migrate:reset すべてのマイグレーションを取り消す
php artisan migrate:refresh マイグレーションをすべてリセットして再実行する

開発中に「一部の修正をやり直したい」ときはrollbackを、「全体をやり直したい」ときはrefreshを使うと覚えておくと便利です。

6. よくあるエラーと対処法

6. よくあるエラーと対処法
6. よくあるエラーと対処法

マイグレーションをロールバックや再実行するときに、次のようなエラーが出ることがあります。


Base table or view not found

これは、すでに削除されたテーブルを再度削除しようとしたときなどに発生します。その場合は、migrate:freshを使って、すべてのテーブルを削除してから再作成すると解決します。


php artisan migrate:fresh --seed

このコマンドは、既存のテーブルをすべて削除してから、新しい状態のマイグレーションを再実行します。開発中の初期化に最適です。

7. まとめ:マイグレーションをやり直して柔軟に開発しよう

7. まとめ:マイグレーションをやり直して柔軟に開発しよう
7. まとめ:マイグレーションをやり直して柔軟に開発しよう

Laravelのマイグレーションでは、rollbackrefreshなどのコマンドを活用することで、データベースの構造を柔軟に調整できます。開発中は何度も試行錯誤することが多いので、これらのコマンドを使いこなせると非常に便利です。安全に変更を管理しながら、理想のデータベース設計を進めていきましょう。

まとめ

まとめ
まとめ

ここまで、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:freshmigrate:refresh の違い(外部キー制約などの扱いや処理効率の差)などは、実戦で非常に役立つ知識です。

最後に、本記事の内容を意識してデータベース設計を行うことで、予期せぬエラーに遭遇しても慌てずに対処できるようになるはずです。 これからもマイグレーションコマンドをフル活用して、効率的でクリーンな開発環境を目指していきましょう。

先生と生徒の振り返り会話

生徒

「先生、今回の内容でマイグレーションの戻し方がバッチリ分かりました!今まで間違えた時は手動でデータベースをいじっていたので、コマンド一つで戻せるのは本当に感動です。」

先生

「それは良かったです!手動でデータベースを変更してしまうと、マイグレーションファイルとの整合性が取れなくなって、後で大きなトラブルになることが多いんです。だから、必ずコマンドを通すのがLaravelの鉄則ですよ。」

生徒

「なるほど…。あ、そういえば migrate:freshmigrate:refresh って、結局どちらを使えばいいんでしょうか?どちらも似たような動きに見えますけど。」

先生

「いい質問ですね! refresh は各ファイルの down() メソッドを一つずつ実行して戻していきます。対して fresh は、既存のテーブルをドロップ(強制削除)してから up() を実行します。開発中でテーブル構造が複雑になり、ロールバックがうまく動かないような時は fresh の方が確実で早いことが多いですね。」

生徒

「使い分けが大事なんですね。あと、--seed オプションも便利そうです。テストデータを毎回入れ直す手間が省けますね。」

先生

「その通りです。特に初期データが必要なシステム開発では php artisan migrate:fresh --seed は魔法の呪文のように使いますよ(笑)。ただし、本番環境では絶対に使わないように注意してくださいね。データがすべて消えてしまいますから!」

生徒

「うわ、それは怖い…。本番では php artisan migrate だけにするように気をつけます!ありがとうございました!」

関連記事:
カテゴリの一覧へ
新着記事
New1
Symfony
Symfonyのルーティングの基本を完全ガイド!YAML・PHP・アノテーションの違いもわかりやすく解説
New2
Laravel
LaravelでAPIのレスポンスをテストする方法を完全解説!assertJsonで初心者も安心
New3
CodeIgniter
CodeIgniterでRESTful API開発!初心者でもわかる全体構成ガイド
New4
Symfony
Symfonyのコントローラとは?作成・構造・役割を初心者向けにやさしく解説!
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのシングルアクションコントローラとは?使い方と利点
No.2
Java&Spring記事人気No2
Laravel
Laravelで動的パラメータをルートに渡す方法!初心者にもやさしいルートパラメータの使い方入門
No.3
Java&Spring記事人気No3
Symfony
Symfonyの依存性注入(DI)とは?コンストラクタでの注入方法を初心者向けに徹底解説
No.4
Java&Spring記事人気No4
Laravel
Laravelでキャッシュを使う方法(ファイル・Redis・Memcached)
No.5
Java&Spring記事人気No5
Laravel
LaravelのBlade構文まとめ!@if @foreach など基本ディレクティブ解説
No.6
Java&Spring記事人気No6
Laravel
Laravelで名前付きルートを設定する方法!初心者でもわかるroute()関数の使い方
No.7
Java&Spring記事人気No7
Laravel
Laravelのマイグレーション履歴を確認する方法を徹底解説!migrate:statusの使い方
No.8
Java&Spring記事人気No8
Symfony
Symfonyとは?PHPの堅牢なフレームワークの特徴と活用シーン