Ограничение внешнего ключа сформировано неправильно (миграция Laravel)

Как написано в журналах ошибок, возможно, ошибка вызвана разными формами в справочной таблице и родительской таблице, но я до сих пор не понимаю, потому что я новичок в программировании.

здесь таблица 1

<?php

Schema::create('questions', function (Blueprint $table) {
    $table->id();
    $table->string('question');
    $table->unsignedInteger('quiz_id');
    $table->timestamps();
});

здесь таблица 2

<?php

Schema::create('answers', function (Blueprint $table) {
    $table->id();
    $table->unsignedInteger('question_id');
    $table->string('answer');
    $table->boolean('is_correct');
    $table->timestamps();
});

Schema::table('answers', function (Blueprint $table){
    $table->foreign('question_id')->references('id')->on('questions')->onDelete('cascade');
});

что я должен изменить в этом коде? спасибо


person Febri Tahta    schedule 02.07.2020    source источник


Ответы (3)


Начиная с Laravel 5.8 $table->id() является псевдонимом $table->bigIncrements('id'), который устанавливает тип данных столбца id на беззнаковый BIGINT под капотом.

В таблице answers у вас есть $table->unsignedInteger('question_id');, что эквивалентно беззнаковому типу данных INT/INTEGER и несовместимо с тем, что представляет $table->id() в таблице questions. Поэтому вам нужно изменить тип данных столбца question_id на беззнаковый BIGINT в таблице answers.

И для этого вам нужно использовать метод Blueprint::unsignedBigInteger(), чтобы сделать тип данных столбца question_id беззнаковым BIGINT, поскольку вы настраиваете его как внешний ключ.

Так что используйте

$table->unsignedBigInteger('question_id'); 

Вместо

$table->unsignedInteger('question_id'); 
person unclexo    schedule 02.07.2020
comment
@FebriTahta НЕ забудьте отметить правильный ответ, который помог вам здесь. :) - person unclexo; 02.07.2020
comment
да, сэр .. спасибо за ваш ответ, у меня была опечатка в моей команде раньше, я удалил. Я уже отмечаю этот ответ как правильный. :) благодарю вас - person Febri Tahta; 02.07.2020

Будьте осторожны: в Laravel 5.8 добавлено bigInteger для внешнего ключа (по умолчанию)

В столбце внешнего ключа сделайте bigInteger() вместо integer().

$table->unsignedBigInteger('question_id');
person sta    schedule 02.07.2020
comment
спасибо, сэр, теперь я понимаю :) - person Febri Tahta; 02.07.2020

$table->id(); — это псевдоним $table->bigIncrements('id'), поэтому вы должны использовать $table->unsignedBigInteger('question_id');

person Ahmad    schedule 02.07.2020
comment
спасибо за ответ, сэр - person Febri Tahta; 02.07.2020