Laravel 7 Общая ошибка: 1215 Невозможно добавить ограничение внешнего ключа - PullRequest
0 голосов
/ 19 апреля 2020

Я искал это часами, не могу решить это. Вот ошибка

General error: 1215 Cannot add foreign key constraint (SQL: alter table 'users' add constraint 'users_discord_id_foreign' foreign key ('discord_id') references 'discord_o_auths' ('id'))

Вот моя миграция DiscordOAuths:

public function up()
{
    Schema::create('discord_o_auths', function (Blueprint $table) {
        $table->engine = "InnoDB";
        $table->integer('id')->unique();
        $table->string('access_token')->unique();
        $table->string('refresh_token')->unique();
        $table->bigInteger('token_expiration');
        $table->timestamps();
    });
}

А вот моя миграция пользователей.

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->engine = "InnoDB";
        $table->id();
        $table->boolean('admin')->default(false);
        $table->integer('color_scheme')->default(0);
        $table->rememberToken();
        $table->timestamps();
    });

    Schema::table('users', function($table) {
        $table->engine = "InnoDB";
        $table->integer('discord_id')->unsigned();
        $table->foreign('discord_id')->references('id')->on('discord_o_auths');
    });
}

Таблица DiscordOAuths также создается перед таблицей Users. Что я делаю не так?

1 Ответ

1 голос
/ 19 апреля 2020

Вы пытаетесь назначить ограничение внешнего ключа для столбца integer, который отличается от столбцов unsigned, которые Laravel использует для своих идентификаторов.

В вашем DiscordOAuths Вы должны заменить $table->integer('id')->unique(); на $table->bigIncrements('id'); или новый метод, добавленный в Laravel 7 $table->id();, который является псевдонимом предыдущего.

Ваш столбец discord_id в users миграция также должна быть столбцом без знака. Вы должны определить его, используя $table->unsignedBigInteger('discord_id'); или его псевдоним, который поставляется с Laravel 7: $table->foreignId('discord_id');

Таким образом, ваши миграции будут выглядеть так:

Для DiscordOAuths

public function up()
{
    Schema::create('discord_o_auths', function (Blueprint $table) {
        $table->engine = "InnoDB";
        $table->id();
        $table->string('access_token')->unique();
        $table->string('refresh_token')->unique();
        $table->bigInteger('token_expiration');
        $table->timestamps();
    });
}

А для users было бы так:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->engine = "InnoDB";
        $table->id();
        $table->boolean('admin')->default(false);
        $table->integer('color_scheme')->default(0);
        $table->rememberToken();
        $table->timestamps();
    });

    Schema::table('users', function($table) {
        $table->engine = "InnoDB";
        $table->foreignId('discord_id');
        $table->foreign('discord_id')->references('id')->on('discord_o_auths');
    });
}
...