Laravel - не удается добавить ограничение внешнего ключа, но таблица все еще переносится в БД? - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь создать сводную таблицу под названием 'role_user', эта таблица является связью между моей таблицей 'user' и таблицей 'role'. Когда я пытаюсь перенести таблицу 'role_user', у меня появляется следующая ошибка:

Illuminate\Database\QueryException 

  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `role_user` add constraint `role_user_user_id_foreign` foreign key (`user_id`) references `users` (`id`))

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673| 

Я хотел бы добавить, что таблица 'role_user' успешно переносится в БД, несмотря на эту ошибку.

Код для моей таблицы 'role_user' приведен ниже:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateRoleUserPivotTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('role_user', function (Blueprint $table) {
            $table->unsignedInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users');

            $table->unsignedInteger('role_id');
            $table->foreign('role_id')->references('id')->on('roles');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('role_user_pivot');
    }
}

Я новичок в laravel, поэтому я был бы признателен за любую помощь. Спасибо.

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Типы данных должны быть одинаковыми, прежде чем вы сможете добавить ограничение. С Laravel ваше поле идентификатора будет, если вы его не изменили, BigInteger. Итак, вам нужно добавить role_id как unsignedBigInteger.

$table->unsignedBigInteger('role_id');

Как указано @I Gusti Ngurah Arya Bawanta, вам также необходимо проверить, существуют ли пользователи и роли перед сводной таблицей. Один из простых способов убедиться в этом - проверить первую часть имени вашего файла миграции. Например, 2014_10_12_000000_create_users_table. php указывает, что миграция была создана 12 декабря 2014 года в полночь. Ваши миграции будут проходить в хронологическом порядке, указанном этой датой для каждой миграции. При необходимости вы можете изменить эту часть даты, чтобы обеспечить перенос таблиц в правильном порядке. Также, читая ваши комментарии выше, InnoDB поддерживает внешние ключи.

Как только вы внесете изменения, о которых я упоминал, запустите php artisan migrate: fre sh. Это удалит ваши текущие таблицы и снова запустит процесс миграции.

0 голосов
/ 07 марта 2020

Миграция таблицы просто останавливается при возникновении ошибок. Есть несколько замечаний по вашей проблеме:

  1. Имя таблицы отличается при создании и отбрасывании, при создании - role_user, а при удалении - role_user_pivot
  2. Там нет Первичный ключ, важно, чтобы в таблице была одна
  3. Таблица users и roles должна существовать до role_user table
  4. Добавление cascade при необходимости, если нет, все в порядке

Ваш код должен выглядеть следующим образом:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateRoleUserPivotTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('role_user', function (Blueprint $table) {
            $table->unsignedInteger('user_id');
            $table->unsignedInteger('role_id');

            $table->primary(['user_id', 'role_id']);
            $table->foreign('user_id')->references('id')->on('users');
            $table->foreign('role_id')->references('id')->on('roles');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('role_user');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...