【Laravel】外部キーで引っかかったらここをチェック!

Laravel

Laravelのマイグレーションが外部キー制約で引っかかる場合があります。こういったときのチェックポイントをまとめておきます。マイグレーションの順番は意外な盲点なので、忘れずチェックしておきましょう!

スポンサーリンク

カラム名はあってる?

最初にマイグレーションのカラム名をチェックです。

// 外部参照するテーブル
Schema::create('items', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('master_id')->comment("マスターのID")->nullable();
    $table->foreign('master_id')->references('id')->on('masters');
});


// 外部参照先(参照を受けるほうの)テーブルのスキーマ
Schema::create('masters', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name')->comment("名前")->nullable();
});

テーブル名、カラム名が正しいか確認してください。

モデルについては、マイグレーションとは無関係です。

スポンサーリンク

型はunsignedBigIntegerにする

IDを外部参照するときは、データ型をunsignedBigIntegerにします。

$table->bigIncrements('id');
//を参照するなら、
$table->unsignedBigInteger('master_id')
//とする

通常、テーブルのIDカラムはbigIncrementsで自動採番としますが、bigIncrementsを参照したい場合は、unsignedBigIntegerで参照する必要があります。

マイグレーションの順番に注意!

盲点です。マイグレーションの順番に注意です。

マイグレーションはファイル名昇順で実行されるので、参照を受けるテーブルを先に作って置く必要があります。

たとえば、以下のようなマイグレーションファイルがあったとします。

この場合、question_setsテーブルからquestion_listsテーブルに参照が向けられていると、マイグレーションはうまくいきません。

create_question_sets_tableが実行される時点では、question_listsテーブルは存在しないためです。必ず参照先のテーブルから作成されるように、マイグレーションファイルの名前を変更しておく必要があります。

また、1つのマイグレーションファイルで複数テーブルを作成する場合も要注意です。

// 外部参照するテーブルをつくる
Schema::create('items', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('master_id')->comment("マスターのID")->nullable();
    $table->foreign('master_id')->references('id')->on('masters');
});

// →mastersテーブルがまだつくられていないので、失敗する

Schema::create('masters', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name')->comment("名前")->nullable();
});

テーブルAからテーブルBを参照するなら、テーブルBのマイグレーションが先に実行されるようにします。

// 外部参照先(参照を受けるほうの)テーブル
Schema::create('masters', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name')->comment("名前")->nullable();
});

// 外部参照するテーブル
Schema::create('items', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('master_id')->comment("マスターのID")->nullable();
    $table->foreign('master_id')->references('id')->on('masters');
});

// →mastersテーブルがつくられているので、成功する

まとめ

個人的によくひっかかると思われるポイントは以上の3点です。

とくにマイグレーションの順番は忘れがちなポイントですので、外部キー制約でエラーとなった場合は、確認してみることをおすすめします。

コメント

タイトルとURLをコピーしました