【Laravel】 5.8系にアップデートしてマイグレーションファイルを自動生成する時に注意する事

久しぶりにLaravelで新しいプロジェクトを作ったのですが、migrateの仕様が変わった部分があったので記事にしてみます。

環境

種類 バージョン
laravel 5.8

migrate:modelでマイグレーションファイルも一緒に作った時の挙動について

モデルを作成と一緒にマイグレーションをします。

$ php artisan migrate:model  Message -m

すると、下記のようなマイグレーションファイルが作成されます。 

<?php

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

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

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

5.5系と現行バージョンとの違い

記事を書いた時点での、最新バージョンは5.8です。

特筆すべきは、インクリメントされるidです。
現行バージョンでは、デフォルトで設定されるインクリメントのデータ型がinteger型からbiginteger型に変わっています。 

Laravelのバージョン5.5時点では、インクリメントの型指定が$table->increments('id')でした。
つまり、デフォルトでインクリメントに指定しているデータ型はinteger型でした。

blog.websandbag.com

子テーブルのマイグレーションを作成する時に、以前作った設定をそのままコピーしても動かない事があります。

外部キーの設定について

親テーブルのインクリメントで指定している型が違うため、子テーブルの外部キーの指定の仕方も変わってきます。
そのため、インクリメント毎の子テーブルでの参照方法について記載します。

また、テーブルの親子関係は下記とします。

  • 親テーブル:messages
  • 子テーブル:message_categories

incrementsの場合

外部キーのデータ型を、unsignedIntegerを指定します。
unsignedIntegerは、チェーンメソッドのunsigned()と同じです。

unsignedを指定する事で、符号なし(-が無い)の値のみ扱えるようになります。

<?php

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

class CreateMessageCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('message_categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedInteger('message_id');
            $table->foreign('message_id')
                ->references('id')
                ->on('messages')
                ->onDelete('cascade');
            $table->timestamps();
            $table->index('message_id);
        });
    }
    // 省略
}

indexの設定は任意ですが、参照の頻度が高いカラムですので指定する事をお勧めします。

bigIncrementsの場合

外部キーのデータ型を、unsignedBigIntegerを指定します。
他の設定はIncrimentsの時と同じです。

<?php

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

class CreateMessageCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('message_categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('message_id');
            $table->foreign('message_id')
                ->references('id')
                ->on('messages')
                ->onDelete('cascade');
            $table->timestamps();
            $table->index('message_id);
        });
    }
    // 省略
}

©︎2017-2018 WebSandBag