Ошибка ограничения внешнего ключа при обновлении миграции - Laravel

У меня проблема с миграцией в моем проекте Laravel.

Поскольку я новичок в Laravel, я не могу понять это.

Я хочу добавить внешний ключ в уже существующую таблицу, и это работает, но когда я обновляю свои миграции, я получаю эту ошибку:

[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key
constraint fails (SQL: drop table `battles`)

[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key
constraint fails

Это миграции, которые у меня есть в настоящее время:

Настольные проекты

class CreateProjectsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('projects', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->string('body');
            $table->string('tags');
            $table->string('img');
            $table->string('img_tricolor');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->timestamps();
        });
    }

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

Настольные баталии

class CreateBattlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('battles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('battle_theme');
            $table->boolean('battle_active');
        });
    }

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

Добавление внешнего ключа для боев в проектах

class AddProjectsBattleIdFk extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('projects', function (Blueprint $table) {
            $table->integer('battle_id')->unsigned();
            $table->foreign('battle_id')->references('id')->on('battles')->onDelete('set null');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('projects', function (Blueprint $table) {
            //
        });
    }
}

Я полагаю, это как-то связано с таблицей сражений.


person Mathijsvdb    schedule 29.11.2015    source источник


Ответы (3)


В методах down вам нужно сначала удалить внешние ключи:

В CreateProjectsTable

public function down()
{
    Schema::table('projects', function (Blueprint $table) {
        $table->dropForeign('projects_user_id_foreign');
    });
    Schema::drop('projects');
}

В AddProjectsBattleIdFk

public function down()
{
    Schema::table('projects', function (Blueprint $table) {
        $table->dropForeign('projects_battle_id_foreign');
        $table->dropColumn('battle_id');
    });
}
person Marcin Nabiałek    schedule 29.11.2015
comment
Это было полезно. Я также не понимал, что вам нужно было использовать официальное странное имя внешнего ключа при вызове dropForeign, пока я не прочитал ваш ответ более внимательно. - person tam5; 17.08.2016

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

person Jeison Ortiz    schedule 19.11.2017

Я не знаю, поможет ли это более обновленное решение кому-то, кто сталкивается с той же проблемой:

используйте это в своей функции миграции вниз
Schema::disableForeignKeyConstraints();

Обычно я создаю последнюю миграцию или называю ее для сортировки последней (потому что команда миграции запускает файлы в папке миграции по порядку), что-то вроде 2099_12_32_AlterTablesCreateForeignKeysmigration, где в функции up я указываю все свои ключи для каждой таблицы и в конце разрешаю внешние ограничения ключей Schema::enableForeignKeyConstraints();, а затем в down я просто отключил их Schema::disableForeignKeyConstraints();, чтобы разрешить сброс для усечения таблиц.

person Helias Fylactos    schedule 16.10.2018