PHP Laravel PDOException Общий столбец ссылки на ошибку и столбец ссылки в ограничении внешнего ключа несовместимы

В настоящее время я выполняю миграцию в 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');
    }
}

любые идеи о том, как я могу решить?

$table->id(); //UNSIGNED BIG INTEGER так $table->unsignedBigInteger('room_id')
Muhammad Shahzad 05.05.2021 20:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
11
1
16 287
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

В этом случае 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()

Пожалуйста, добавьте объяснение к своему ответу, чтобы другие могли извлечь из него уроки - зачем это нужно?

Nico Haase 24.04.2020 23:34

В Ларавель 6.0 миграции такие же, как и в @Паям Ханинеджад. то есть

$table->bigInteger('user_id')->unsigned()->index();

Я обновляю это для Ларавель 6.0, потому что я следовал старому руководству, которое показало ту же ошибку.

Также в laravel 7.x вам, возможно, придется изменить:

$table->increments('id'); // UNSIGNED INTEGER
// to 
$table->id(); // UNSIGNED BIGINT

Пожалуйста, добавьте объяснение к своему ответу, чтобы другие могли извлечь из него уроки - как это изменение связано с данным сообщением об ошибке?

Nico Haase 24.04.2020 23:34

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

        $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

Другие вопросы по теме