Отношение Laravel «многие ко многим» Невозможно добавить ограничение внешнего ключа

Я создаю отношения ManyToMany с фреймворком Laravel v.5.7. Итак, я создал три миграции.

Таблица модулей

Schema::create('modules', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name')->unique();
    $table->integer('price');
});

Таблица планов

Schema::create('plans', function (Blueprint $table) {
    $table->increments('id');
    $table->string('stripe_id')->unique();
    $table->integer('price');
    $table->integer('max_users');
    $table->timestamps();
});

Таблица отношений

Schema::create('plan_modules', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('plan_id')->unsigend();
    $table->integer('module_id')->unsigend();
    // Keys
    $table->foreign('plan_id')->references('id')->on('plans')->onDelete('cascade');
    $table->foreign('module_id')->references('id')->on('modules')->onDelete('cascade');
});

Когда я запускаю миграцию, я получаю General error: 1215 Cannot add foreign key constraint.

У кого-нибудь есть идеи, что не так с миграциями. Движок по умолчанию для mysql установлен на InnoDB.

Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
720
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ваша последняя миграция должна быть следующей:

Schema::create('plan_modules', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('plan_id')
    $table->unsignedInteger('module_id');
    $table->foreign('plan_id')->references('id')->on('plans')->onDelete('cascade');
    $table->foreign('module_id')->references('id')->on('modules')->onDelete('cascade');
});

Исправлены опечатки, и вам нужно применить onDelete() к определению внешнего ключа, а не к фактическому определению поля.

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

Спасибо, это работает. В чем разница между unsignedInteger() и integer()->unsigned()?

Markus 27.01.2019 13:18

По сути делает то же самое :)

Mozammil 27.01.2019 13:19

Приращение @Markus - это целое число без знака, и следует помнить, что атрибуты связанных полей должны быть точно такими же, как и атрибуты реляционных полей. Также попробуйте следовать соглашению об именах Eloquent, которое говорит вам, что имя сводной таблицы должно быть module_plan (проверьте почему в документации). Позже это решит много головной боли, если вы будете следовать их стандартам.

Tpojka 27.01.2019 14:57

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