Почему создание внешнего ключа в Laravel 5.8 не удается?

Приведенный ниже скрипт миграции без проблем работал в старой версии Laravel, но я добавил его в свой новый Laravel 5.8 и запустил скрипт. Я получаю Error: foreign key was not formed correctly

Миграция оценки:

public function up() { 
    Schema::create('evaluation', function (Blueprint $table) { 
        $table->increments('id'); 
        $table->integer('user_id')->unsigned()->index(); 
        $table->timestamps();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

Миграция пользователей:

public function up() { 
    Schema::create('users', function (Blueprint $table) { 
        $table->bigIncrements('id'); 
        $table->timestamps();
    });
}

Существует ли таблица users до того, как вы запустите это? Вы не можете объявить ссылку внешнего ключа на таблицу до ее существования.

Bill Karwin 04.03.2019 21:22

@BillKarwin, конечно, ты хочешь, чтобы я поделился схемой для этого?

Iftikhar uddin 04.03.2019 21:23

Это было бы полезно, так как мы подтверждаем, что это целое число без знака и первичный ключ.

Bill Karwin 04.03.2019 21:41

Вам также может понравиться контрольный список, который я внес для внешних ключей: stackoverflow.com/a/4673775/20860

Bill Karwin 04.03.2019 21:42

@BillKarwin Я добавил таблицу users, вы можете проверить сейчас?

Iftikhar uddin 05.03.2019 15:19

Я не эксперт по laravel, но похоже, что users.id будет BIGINT, но вы объявляете evaluation.user_id как INT UNSIGNED? Это не сработает. Они должны быть точно такого же типа данных.

Bill Karwin 05.03.2019 16:21

Ага, я нашел блог, который подтверждает, что тип приращений Laravel по умолчанию будет беззнаковым. Но вы должны объявить столбец внешнего ключа как bigInteger, чтобы он соответствовал размеру первичного ключа, на который он ссылается.

Bill Karwin 05.03.2019 16:25

Также я не уверен, что в синтаксисе Laravel bigIncrements неявно объявляет user.id первичным ключом этой таблицы? Внешний ключ должен ссылаться на столбец, который является первичным ключом или уникальным ключом.

Bill Karwin 05.03.2019 16:26

@BillKarwin это точная причина, по которой я получаю сообщение об ошибке. Я изменил тип данных, и ошибка исчезла. Большое спасибо, приятель. Вы можете поместить решение в качестве ответа.

Iftikhar uddin 05.03.2019 16:31

@BillKarwin Я изменил user_id в коде миграции на $table->unsignedBigInteger('user_id');, теперь он работает нормально.

Iftikhar uddin 05.03.2019 16:34
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
9
10
5 324
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Вы объявили свой первичный ключ user.id как $table->bigIncrements('id'), который становится BIGINT UNSIGNED AUTO_INCREMENT в синтаксисе MySQL.

Вы должны объявить внешний ключ как $table->unsignedBigInteger('user_id'), который станет BIGINT UNSIGNED в MySQL, что сделает его совместимым с внешним ключом для столбца user.id.

Ага! unsignedBigInteger, не просто bigInteger!

CJ Dennis 26.07.2019 09:02

Используя ларавель 5.5. Этот метод все еще терпит неудачу. Я даже выделил схему для объявления внешних ключей. Все еще не повезло

SMPLYJR 14.11.2019 06:22

@S.Domeng, я предлагаю вам просмотреть контрольный список здесь. Если это все еще не удается, попробуйте задать новый вопрос и показать, что вы пробовали. Вы не получите никаких полезных ответов, если скажете только «это терпит неудачу.». Вы должны показать, что вы пробовали, И показать результат SHOW CREATE TABLE для обеих таблиц и показать точное сообщение об ошибке, которое вы получили.

Bill Karwin 14.11.2019 08:08

Спасибо @BillKarwin, но я в разделе комментариев. Я не уверен, что объяснять вещи здесь - правильный способ спросить. Двигаясь вперед, я понял проблему ... Ограничение внешнего ключа с моей стороны Исправлено путем создания имени файла справочной таблицы миграции во множественном числе. Произнесите create_users_table. Моя ошибка в том, что у меня единственное имя create_user_table.

SMPLYJR 14.11.2019 09:50

Отредактировано: не уверен, что это тот, который ограничивает внешний ключ в моем конце. Тем не менее, это соглашение из документации. Однако я также перезапустил свой сервер. Я использую Ларагон. Вы можете сделать это с помощью XAMPP, WAMP и даже в Vagrant.

SMPLYJR 14.11.2019 10:01
  update your `integer('user_id')` to `bigInteger('user_id')`
public function up() { 
        Schema::create('evaluation', function (Blueprint $table) { 
            $table->increments('id'); 
            $table->bigInteger('user_id')->unsigned()->index(); 
            $table->timestamps();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
    }

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