将外键添加到迁移失败 - Laravel

时间:2015-11-26 19:54:55

标签: php mysql laravel

我现在正在开发一个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');
    }
}

如果文件名很重要,这些是文件名:

  • 2015_10_13_120958_create_projects_table.php
  • 2015_11_26_182256_create_battles_table.php

这些是错误消息:

[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)

我以前没有任何改变迁移的问题。这是第一次发生在我身上。如果我删除外键,一切都会像以前一样工作。

2 个答案:

答案 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');
    }
}