久しぶりに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型でした。
子テーブルのマイグレーションを作成する時に、以前作った設定をそのままコピーしても動かない事があります。
外部キーの設定について
親テーブルのインクリメントで指定している型が違うため、子テーブルの外部キーの指定の仕方も変わってきます。
そのため、インクリメント毎の子テーブルでの参照方法について記載します。
また、テーブルの親子関係は下記とします。
- 親テーブル: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); }); } // 省略 }