61
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-06-26

暇なときに予定を探せるアプリyoteiPickerをリリースしました。

実務で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のマイグレーションファイルを削除する

スクリーンショット 2021-06-26 12.58.50.png

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選

暇なときに予定を探せるアプリyoteiPickerをリリースしました。

61
50
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?