У меня проблема с миграцией в моем проекте 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) {
//
});
}
}
Я полагаю, это как-то связано со столом сражений.
В 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');
});
}
У меня была та же проблема, ответ Марцина сработал, но я также обнаружил, что другой вариант использует fresh
вместо refresh
В этом случае вам не нужно удалять внешние ключи.
Я не знаю, поможет ли это более обновленное решение кому-то, кто сталкивается с той же проблемой:
используйте это в вашей функции перехода вниз
Schema::disableForeignKeyConstraints();
Я обычно создаю последнюю миграцию или называю ее сортировкой последней (потому что команда миграции запускает файлы в папке миграции по порядку) что-то вроде 2099_12_32_AlterTablesCreateForeignKeysmigration
где в up
Функция Я задаю все мои ключи для каждой таблицы и в конце включить ограничения внешних ключей Schema::enableForeignKeyConstraints();
а затем в down
я просто отключил их Schema::disableForeignKeyConstraints();
чтобы позволить сбросу обрезать таблицы.