我现在正在开发一个Laravel项目,但我遇到了一个问题。
我正在尝试为迁移添加外键,但在尝试迁移时似乎失败了。
这是我想要改变的迁移:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
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');
/*
* this is the foreign key I'm trying to add
*/
$table->integer('battle_id')->unsigned();
$table->foreign('battle_id')->references('id')->on('battles');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('projects');
}
}
这是战斗表的迁移:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
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');
}
}
如果文件名很重要,这些是文件名:
这些是错误消息:
[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1005 Can't create table 'scotchbox.#sql3f4_1a4' (errno: 150) (SQL: alter
table `projects` add constraint projects_battle_id_foreign foreign key (`battle_id`) references `battles`
(`id`))
[PDOException]
SQLSTATE[HY000]: General error: 1005 Can't create table 'scotchbox.#sql-3f4_1a4' (errno: 150)
我以前没有任何改变迁移的问题。这是第一次发生在我身上。如果我删除外键,一切都会像以前一样工作。
答案 0 :(得分:0)
我最终找到了自己问题的答案。
迁移不起作用,因为'create_projects_table.php'迁移试图添加一个列,该列引用了尚不存在的列。
因此,迁移的顺序显然很重要。
我通过创建一个新的迁移来修复它,将外键添加到我的数据库中的'projects'表中。
此迁移在创建“战斗”表后运行。
答案 1 :(得分:0)
或者这样做,这应该工作。请注意,战斗将在项目之前创建,因此将存在。此外,当您删除它们时,首先删除项目或它将引发错误
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateBattlesTable extends Migration
{
public function up()
{
Schema::create('battles', function (Blueprint $table) {
$table->increments('id');
$table->string('battle_theme');
$table->boolean('battle_active');
});
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');
/*
* this is the foreign key I'm trying to add
*/
$table->integer('battle_id')->unsigned();
$table->foreign('battle_id')->references('id')->on('battles');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('projects');
Schema::drop('battles');
}
}