Laravelのrefreshとfreshの違いを初心者でもわかる解説
生徒
「先生、Laravelでマイグレーションをやり直すときにrefreshとfreshってありますけど、何が違うんですか?」
先生
「それは良い質問です。簡単に言うと、両方ともデータベースのテーブルをリセットして再作成するコマンドですが、細かい動作が少し違います。」
生徒
「具体的にはどのような違いがあるんですか?」
先生
「それでは順を追って説明しますね。」
1. refreshとは?(ロールバックを伴う再構築)
Laravelのphp artisan migrate:refreshは、これまでに実行したマイグレーションを逆順に一つずつ取り消し(ロールバック)してから、再度すべて実行し直すコマンドです。初心者の方には「一度巻き戻してから、もう一度録画し直す」ようなイメージと伝えると分かりやすいかもしれません。
このコマンドの最大の特徴は、各マイグレーションファイルに書かれたdown()メソッドを呼び出す点にあります。そのため、単にテーブルを消すだけでなく、特定の処理を挟みながら安全にリセットしたい場合に適しています。
例えば「usersテーブル」を作った後に「postsテーブル」を作った場合、refreshを実行すると「postsを削除」→「usersを削除」→「usersを作成」→「postsを作成」というステップを丁寧に踏みます。
// ターミナルで実行する基本コマンド
php artisan migrate:refresh
実行すると、コンソールには以下のように「Rolling back(巻き戻し)」と「Migrating(再適用)」のログが順番に表示されます。
Rolling back: 2026_01_01_000001_create_posts_table
Rolling back: 2026_01_01_000000_create_users_table
Migrating: 2026_01_01_000000_create_users_table
Migrating: 2026_01_01_000001_create_posts_table
また、開発中によく使うのが「テーブルを直した後にテストデータを入れ直す」作業です。その場合は--seedオプションを使いましょう。これにより、データの流し込み(Seeding)までを一気に自動化できます。
// テーブルを再作成して、初期データ(Seeder)も注入する
php artisan migrate:refresh --seed
注意点として、refreshは既存のデータをすべて削除します。開発環境で「テーブル構造をちょっと変えたから、最初からやり直したいな」という時に非常に重宝する、Laravel開発の基本コマンドです。
2. freshとは?
一方でphp artisan migrate:freshは、テーブルをすべて削除してからマイグレーションを実行するコマンドです。refreshとの違いは、個別のロールバックを経ずに一気にテーブルを削除する点です。
つまり、テーブル数が多い場合や、すべてのデータをリセットして一から環境を作りたいときに便利です。
php artisan migrate:fresh
Seederも同時に実行したい場合は、refreshと同じように--seedをつけます。
php artisan migrate:fresh --seed
3. refreshとfreshの違いをイメージで理解
わかりやすく例えると、refreshは「テーブルを一つずつ掃除して作り直す」、freshは「部屋ごと全部片付けて新しく家具を置く」というイメージです。どちらも最終的には新しい状態になりますが、処理の順序や方法が異なります。
そのため、テーブルに依存関係がある場合や部分的にマイグレーションをやり直したい場合はrefresh、すべてをリセットして一から構築したい場合はfreshを使う、と覚えておくと良いです。
4. 実務での使い分けポイント
実務では、開発中にテーブルを頻繁に変更する場合やテストデータを何度も入れ直す場合があります。このとき、以下のように使い分けます。
- 部分的にマイグレーションをやり直したい →
php artisan migrate:refresh - すべてのテーブルとデータをリセットして一から構築 →
php artisan migrate:fresh
また、Seederも同時に使うことで、毎回テスト用の初期データを簡単に準備できます。
5. 注意点
どちらのコマンドも、実行すると既存のデータは削除されます。そのため、本番環境では安易に使用せず、開発やテスト環境で使うことが推奨されます。間違えて本番データを消してしまわないように注意してください。