migrationの作成と実行方法

migrationファイルの作成方法、migrateコマンドの実行方法について解説します。マイグレーション関連の操作は色々とできますが、特に知っておくと良いメソッドや操作について取り上げています。

マイグレーションの生成

新規テーブルを作成したい場合

「tests」というテーブルを作成する場合、--createオプション を指定します。

php artisan make:migration create_tests_table --create=tests

以下マイグレーションファイルが生成されました。

<?php

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

class CreateTestsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tests', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }

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

既存テーブルの構造を変更したい場合

「tests」というテーブルの構造を変更したい場合、--tableオプション を指定します。

php artisan make:migration add_column_to_tests_table --table=tests

以下マイグレーションファイルが生成されました。

<?php

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

class AddColumnToTestsTable 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) {
            //
        });
    }
}

テーブル構造の指定

カラムの 型指定 について確認します。

ここでは、下記コマンド実行後に生成されたマイグレーションファイルを編集していきます。

php artisan make:migration create_tests_table --create=tests

マイグレーションファイルには、以下のように記述しました。

<?php

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

class CreateTestsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tests', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('integer')->comment('数値');
            $table->bigInteger('big_integer')->default(0);
            $table->integer('unsigned_integer_1')->unsigned();
            $table->unsignedInteger('unsigned_integer_2');

            $table->float('float', 8, 2);
            $table->double('double', 15, 8);

            $table->string('string')->nullable();
            $table->string('string100', 100);
            $table->text('text');

            $table->enum(
                'enum',
                ['DEBUG', 'INFO', 'NOTICE', 'WARNING', 'ERROR', 'CRITICAL', 'ALERT', 'EMERGENCY']
            );
            $table->geometry('geometry');
            $table->json('json');

            $table->date('date');
            $table->dateTime('dateTime');
            $table->timestamp('timestamp');
            $table->timestamps();
            $table->softDeletes();

            $table->unique('integer');
            $table->index(['string', 'string100']);
        });
    }

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

マイグレーションの実行

下記コマンドでマイグレーションを実行します。

php artisan migrate

作成されたテーブルを確認

今回のマイグレーションで以下テーブルが作成されました。DBはMySQL5.7です。

mysql> SHOW COLUMNS FROM `tests`;
+--------------------+--------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| Field              | Type                                                                           | Null | Key | Default           | Extra                       |
+--------------------+--------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| id                 | int(10) unsigned                                                               | NO   | PRI | NULL              | auto_increment              |
| integer            | int(11)                                                                        | NO   | UNI | NULL              |                             |
| big_integer        | bigint(20)                                                                     | NO   |     | 0                 |                             |
| unsigned_integer_1 | int(10) unsigned                                                               | NO   |     | NULL              |                             |
| unsigned_integer_2 | int(10) unsigned                                                               | NO   |     | NULL              |                             |
| float              | double(8,2)                                                                    | NO   |     | NULL              |                             |
| double             | double(15,8)                                                                   | NO   |     | NULL              |                             |
| string             | varchar(255)                                                                   | YES  | MUL | NULL              |                             |
| string100          | varchar(100)                                                                   | NO   |     | NULL              |                             |
| text               | text                                                                           | NO   |     | NULL              |                             |
| enum               | enum('DEBUG','INFO','NOTICE','WARNING','ERROR','CRITICAL','ALERT','EMERGENCY') | NO   |     | NULL              |                             |
| geometry           | geometry                                                                       | NO   |     | NULL              |                             |
| json               | json                                                                           | NO   |     | NULL              |                             |
| date               | date                                                                           | NO   |     | NULL              |                             |
| dateTime           | datetime                                                                       | NO   |     | NULL              |                             |
| timestamp          | timestamp                                                                      | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| created_at         | timestamp                                                                      | YES  |     | NULL              |                             |
| updated_at         | timestamp                                                                      | YES  |     | NULL              |                             |
| deleted_at         | timestamp                                                                      | YES  |     | NULL              |                             |
+--------------------+--------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
19 rows in set (0.00 sec)

テーブル作成で実行されたSQL

テーブル作成時に実行されたSQLは以下のようになります。

mysql> SHOW CREATE TABLE `tests`\G;
*************************** 1. row ***************************
       Table: tests
Create Table: CREATE TABLE `tests` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `integer` int(11) NOT NULL COMMENT '数値',
  `big_integer` bigint(20) NOT NULL DEFAULT '0',
  `unsigned_integer_1` int(10) unsigned NOT NULL,
  `unsigned_integer_2` int(10) unsigned NOT NULL,
  `float` double(8,2) NOT NULL,
  `double` double(15,8) NOT NULL,
  `string` varchar(255) DEFAULT NULL,
  `string100` varchar(100) NOT NULL,
  `text` text NOT NULL,
  `enum` enum('DEBUG','INFO','NOTICE','WARNING','ERROR','CRITICAL','ALERT','EMERGENCY') NOT NULL,
  `geometry` geometry NOT NULL,
  `json` json NOT NULL,
  `date` date NOT NULL,
  `dateTime` datetime NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `deleted_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `tests_integer_unique` (`integer`),
  KEY `tests_string_string100_index` (`string`,`string100`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)

※補足

  • $table->timestamps();created_atupdated_at が作成されています。
  • $table->softDeletes();deleted_at が作成されています。

外部キー制約

外部キー制約も定義できます。

「testsテーブルのuser_id」を外部キーとして、「usersテーブルのid」を参照するようにする場合、以下のように記述します。

Schema::create('users', function (Blueprint $table) { 
    $table->increments('id'); 
               :
});
 
Schema::create('tests', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->unsignedInteger('user_id'); 

    $table->foreign('user_id') 
        ->references('id') 
        ->on('users') 
        ->onDelete('cascade');  // 参照先が削除されたら同時に削除

注意点

  • 先に参照先のテーブルを作成します。
  • 参照元のカラムと参照先のカラムの型が一致する必要があります。
    • incrementsスキーマビルダーは符号なしINT型を生成します。そのため、参照元カラムのスキーマビルダーとしてunsignedIntegerを利用しています。
  • 削除時(drop)は、先に参照元テーブルを削除します。

テーブル構造変更

テーブル構造変更する際に活躍するメソッドを紹介します。

存在するときだけ実行

if (Schema::hasTable('tests')) {
    // testsテーブルが存在するときだけ実行
}
if (Schema::hasColumn('tests', 'name')) {
    // testsテーブルにnameカラムが存在するときだけ実行
}

rename|テーブル名変更

Schema::rename('現在のテーブル名', '変更後のテーブル名');

renameColumn|カラム名変更

renameColumnメソッド を利用してカラム名を変更します。

Schema::table('tests', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
});

change|カラム属性変更

changeメソッド を利用してカラム属性を変更します。

Schema::table('tests', function (Blueprint $table) {
    $table->string('string100', 1000)->change();
});

after|カラム追加位置指定

release_date というカラムの後に scheduled_date というカラムを追加したい場合、以下のようにします。

Schema::table('tests', function (Blueprint $table) {
    $table->dateTime('scheduled_date')->after('release_date');
});

drop|カラム削除

dropメソッド を利用してカラムを削除します。

Schema::table('tests', function (Blueprint $table) {
    $table->dropColumn('name');
});

ロールバック

ロールバック

最後のマイグレーションをロールバックします。

php artisan migrate:rollback

全てロールバック

全てのマイグレーションをロールバックします。

php artisan migrate:reset

データベース作り直し

refresh

全てのマイグレーションをロールバック後、マイグレーションを実行します。

php artisan migrate:refresh

fresh

全てのテーブルを削除後、マイグレーションを実行します。

php artisan migrate:fresh