В настоящее время я выполняю миграцию в Laravel через терминал и получаю эти две ошибки при попытке использовать миграцию php artisan; Я распечатаю ошибки ниже:
Exception trace:
1 PDOException::("SQLSTATE[HY000]: General error: 3780 Referencing column 'room_id' and referenced column 'id' in foreign key constraint 'contacts_room_id_foreign' are incompatible.")
/Users/shaquilenoor/Desktop/chatapi/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458
2 PDOStatement::execute()
/Users/shaquilenoor/Desktop/chatapi/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458Судя по коду, содержащемуся в трассировке исключений, проблема, по-видимому, связана с приведенным ниже кодом:
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateContactsTable extends Migration
{
public function up()
{
Schema::create('contacts', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user1_id');
$table->unsignedInteger('user2_id');
$table->integer('room_id')->unique();
$table->timestamps();
$table->foreign('room_id')->references('id')->on('rooms');
$table->foreign('user1_id')->references('id')->on('users');
$table->foreign('user2_id')->references('id')->on('users');
});
}
public function down()
{
Schema::dropIfExists('contacts');
}
}любые идеи о том, как я могу решить?






В этом случае room_id должен быть без знака. Попробуй это:
public function up()
{
Schema::create('contacts', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user1_id');
$table->unsignedInteger('user2_id');
$table->integer('room_id')->unique()->unsigned();
$table->timestamps();
$table->foreign('room_id')->references('id')->on('rooms');
$table->foreign('user1_id')->references('id')->on('users');
$table->foreign('user2_id')->references('id')->on('users');
});
}
Это связано с тем, что внешние ключи устанавливаются до создания таблицы комнат. вы можете исправить это, выполнив следующие действия.
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateContactsTable extends Migration
{
public function up()
{
Schema::disableForeignKeyConstraints();
Schema::create('contacts', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user1_id');
$table->unsignedInteger('user2_id');
$table->integer('room_id')->unique();
$table->timestamps();
$table->integer('room_id')->unsigned();
$table->integer('user1_id')->unsigned();
$table->integer('user2_id')->unsigned();
$table->foreign('room_id')->references('id')->on('rooms');
$table->foreign('user1_id')->references('id')->on('users');
$table->foreign('user2_id')->references('id')->on('users');
});
Schema::enableForeignKeyConstraints();
}
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::dropIfExists('contacts');
Schema::enableForeignKeyConstraints();
}
}
Если вы находитесь на Ларавель 5.8, новая миграция изменена на большие приращения, поэтому для исправления ошибки рефренсинга просто измените целое число на bigInteger, например:
$table->integer('user_id')->unsigned()->index();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
Будет изменено на:
$table->bigInteger('user_id')->unsigned()->index();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
Либо измените исходную миграцию от
bigIncrements()
чтобы просто
increments();
Или В столбце внешнего ключа выполните
bigInteger()
вместо
integer()
Пожалуйста, добавьте объяснение к своему ответу, чтобы другие могли извлечь из него уроки - зачем это нужно?
В Ларавель 6.0 миграции такие же, как и в @Паям Ханинеджад. то есть
$table->bigInteger('user_id')->unsigned()->index();
Я обновляю это для Ларавель 6.0, потому что я следовал старому руководству, которое показало ту же ошибку.
Также в laravel 7.x вам, возможно, придется изменить:
$table->increments('id'); // UNSIGNED INTEGER
// to
$table->id(); // UNSIGNED BIGINT
Пожалуйста, добавьте объяснение к своему ответу, чтобы другие могли извлечь из него уроки - как это изменение связано с данным сообщением об ошибке?
Кажется, это проблема с таблицами, которые были перенесены в более старые версии. У меня такая же проблема, и в моем случае я использовал два разных типа объявлений для каждого внешнего ключа. "целое" и "целое без знака"
$table->integer('webcam_id');
$table->unsignedInteger('user_id');
$table->foreign('webcam_id')
->references('id')
->on('webcam');
$table->foreign('user_id')
->references('id')
->on('users');
$table->increments('id');
$table->integer('user_id')->unsigned(); //adding unsigned() here, will fix the error
$table->foreign('user_id')->references('id')->on('users');
Внешний ключ должен совпадать с идентификатором ссылки, и, следовательно, изменить
$table->integer('room_id')->unique();
к
$table->unsignedBigInteger('room_id')->unique();
и это делает свое дело.
PS: вы получите еще одну ошибку
SQLSTATE[42S01]: Base table or view already exists: 1050 Table...
просто удалите таблицу и запустите php artisan migrate
Недавно я столкнулся с этой проблемой во время миграции, чтобы создать таблицу с ограничением внешнего ключа. Я обнаружил, что это должно быть связано с сопоставлением, используемым в таблице. Наша схема БД загружается с файлом схемы, для которого сопоставление таблиц установлено на utf8mb4_0900_ai_ci. Похоже, Laravel по умолчанию использует utf8mb4_unicode_ci.
Я решил проблему, установив параметры сортировки для таблицы во время создания с помощью $table->collation = 'YOUR_COLLATION_VALUE'.
Для Laravel 8.x измените $table->integer('user_id')->unsigned()->index(); на:
$table->unsignedBigInteger('user_id'); , поскольку он совместим с типом данных id().
в миграции вашей комнаты измените идентификатор как таковой
$table->id();
он автоматически создаст bigInteger с именем «id»
затем в переносе контактов используйте
$table->bigInteger('room_id')->references('id')->on('rooms');
то же самое относится и к другим внешним ключам, просто следуйте приведенному выше коду.
хорошо, по крайней мере, этот синтаксис работает на laravel 8
$table->id(); //UNSIGNED BIG INTEGERтак$table->unsignedBigInteger('room_id')