【実務で使える】Laravelマイグレーションのチートシート


実務でLaravelを使うにあたり、マイグレーションはよく操作するので、チートシートを用意しました。

マイグレーションのコマンド一覧

・マイグレーションがrunしているかステータスを確認

$ php artisan migrate:status

・マイグレーションの実行

$ php artisan migrate

・ロールバック

$ php artisan migrate:rollback

・マイグレーションファイルの新規作成

$ php artisan make:migration create_テーブル名_table --create=テーブル名

例:
$ php artisan make:migration create_tests_table --create=tests

・既存テーブルにカラムを追加

$ php artisan make:migration add_カラム名_to_テーブル名 --table=テーブル名

例:
$ php artisan make:migration add_email_to_tests_table --table=tests

・既存テーブルのカラムを削除

$ php artisan make:migration drop_カラム名_to_テーブル名 --table=テーブル名

例:
$ php artisan make:migration drop_email_to_tests --table=tests

詳細に解説

【事前準備】
■今回は練習用にtestsテーブルを作成。
■開発環境
Laravel6系、mysql5.7,ツールはphpMyAdmin

 マイグレーションファイルの作成

$ php artisan make:migration create_テーブル名_table --create=テーブル名

--createテーブル名は任意ですが、このオプションをつけることによって、「データベースに--create=テーブル名で指定したテーブルを作成する」という指示になります。

似たオプションで、--tableがありますが、こちらはすでにテーブルがある時に使います。
--tableオプションをつけることで、「データベースの--table=テーブル名で指定したテーブルを使用する」となります。

testsファイルの作成

$ php artisan make:migration create_tests_table --create=tests

マイグレーションファイルが作成されます。
※まだ$ php artisan migrateを実行していないので、データベースにテーブルは作成されません。

ファイル作成される場所:
database>migrations>マイグレーションファイル

xxxx_create_tests_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTestsTable extends Migration
{
  public function up()
  {
    Schema::create('tests', function (Blueprint $table) {
      $table->increments('id');
      $table->timestamps();
    });
  }

  public function down()
  {
    Schema::dropIfExists('tests');
  }
}

マイグレーションファイルを編集する
今回は、sampleテーブルでnameカラムを持たせるのみにします。

xxxx_create_tests_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTestsTable extends Migration
{
  public function up()
  {
    Schema::create('tests', function (Blueprint $table) {
      $table->increments('id');
            $table->string('name');
      $table->timestamps();
    });
  }

  public function down()
  {
    Schema::dropIfExists('tests');
  }
}

マイグレーションの実行
※実行することで、マイグレーションファイルを編集した内容が反映され、データベースにもテーブルが作成される。

$ php artisan migrate

これで、データベースにテーブルが作成される。

既存テーブルにカラムを追加

マイグレーションファイルを作成してテーブルも作成できたけど、やっぱりカラムを追加したい!って思う時もあります。しかし、先程のマイグレーションファイルを再度編集して$ php artisan migrateを実行してもカラムは追加できません。

じゃあどうすればいいのか。

方法は、カラム追加用のマイグレーションファイルを作成するです。

例えば、sampleテーブルにemailカラムを追加したい!ってなったときのやり方。

php artisan make:migration add_email_to_tests_table --table=tests

--tableオプションをつけることによって、変更したいテーブルを指定できます。

カラム追加用のマイグレーションファイルが新たに作成される

database/migrations/××××_add_email_to_tests_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddEmailToTestsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('tests', function (Blueprint $table) {
            //
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('tests', function (Blueprint $table) {
            //
        });
    }
}

追加するカラムをマイグレーションファイルに記述

database/migrations/××××_add_email_to_tests_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddEmailToTestsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('tests', function (Blueprint $table) {
            //カラム追加
            $table->string('email', 255)->after('name'); 
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('tests', function (Blueprint $table) {
            //カラムの削除
            $table->dropColumn('email'); 
        });
    }
}

マイグレートを実行。

$ php artisan migrate

データベースにemailカラムが追加される。

マイグレーションファイルの削除

マイグレーションファイルを作成したけど、テーブルを削除したいとかあると思います。
そんな時は以下の方法を試してみましょう。

①マイグレートを実行していない場合
データベースにもテーブルは作成されていないので、マイグレーションファイルを削除するだけでいいです。

②すでにマイグレートしている場合
データベースにもテーブルが作成されており、マイグレーションファイルを削除しただけだと、次にマイグレートした時にエラーがでます。

マイグレートとは、以下のコマンドを指します。

$ php artisan migrate

なので、方法としては以下です。

パターン①:テーブル削除用のマイグレーションファイルを作成する

データベースにすでにpostsテーブルがあって、migrateも実行している状況だとします。

まずは、dropコマンドでテーブルを削除するマイグレーションファイルを作成しましょう。

php artisan make:migration drop_テーブル名_table --table=データベースに存在するテーブル名を指定
$ php artisan make:migration drop_posts_table --table=posts

これで、database>migrationにあるマイグレーションファイルを見ると、
2021_07_08_10023_drop_posts_table.php って感じでマイグレーションファイルが作成されます。

あとはupメソッドのところにdropの処理を、downのところにcreateの処理を書けばいいです。
つまり、テーブルを作る時の逆になります。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class DropPostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::dropIfExists('posts');
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('post_id');
            $table->integer('user_id');
            $table->string('amount');
            $table->timestamps();
        });
    }
}

実務ではこちらを使うことが多いでしょう。

パターン②:データベースをリフレッシュする。
※データベースを全て自動的にrollbackして、migrateを実行してくれるコマンドです。

php artisan migrate:refresh

refreshした後にrollbackする。
※refreshした後にrollbackすると全てのテーブルをrollbackしてくれます。

php artisan migrate:rollback

以下を実行すると、マイグレーションファイルが動いているかどうか確認できます。

php artisan migrate status

こんな感じで全てrollbackされています。

No   | 2014_10_12_000000_create_users_table           |       |
| No   | 2014_10_12_100000_create_password_resets_table |       |
| No   | 2019_08_19_000000_create_failed_jobs_table     |       |
| No   | 2021_06_20_144833_create_categories_table      |       |
| No   | 2021_06_20_144855_create_products_table        |       |
| No   | 2021_06_26_113620_create_sample_table          |       |
| No   | 2021_06_26_123437_add_email_to_sample_table  

ここで削除したいマイグレーションファイルを削除します。

今回は練習として、sampleテーブルを作り直したいという想定でやります。

1.sampleのマイグレーションファイルを削除する
※追加したemailカラムのマイグレーションファイルも忘れずに削除する

2.新たにマイグレーションファイルを作成する

3.マイグレートを実行する

1.sampleのマイグレーションファイルを削除する

create_sample...とadd_email...ファイルを削除しましょう。
※特にコマンドとかなくてゴミ箱にポイするだけです。

あとは最初の方で書いたようにマイグレーションファイルを作成します。
※自由にカラムなどを変更して作成してみてください。

そしてphp artisan migrateを実行しましょう。

新たに作り直したsampleテーブルが作成されます。

マイグレーションの役立つコマンド集

マイグレーションの実行
php artisan migrate

マイグレーションが実行されているかを確認したい場合
実行されていればrun
実行されていない場合はNo
php artisan migrate:status

マイグレーションのロールバック
php artisan migrate:rollback

最後の5つのマイグレーションをロールバックしたいとき
php artisan migrate:rollback --step=5

すべてのマイグレーションをロールバック
php artisan migrate:reset

もしこの記事が役に立ったという場合は、LGTMまたはストックをお願いします。

>>フリーランスも対象!エンジニア転職におすすめなサイト5選