如何在 Laravel 迁移中创建自引用关系(外键)?

How to create a self-reference relationship (foreign key) in a Laravel migration?

我从一个建立在 Laravel 5.2 之上的自学项目开始,我发现了我的第一个问题:迁移中的自我引用。

这是文件 2016_08_02_024942_create_navigation_table.php 的样子(我删除了注释,以免 post 太长):

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateNavigationTable extends Migration
{
    public function up()
    {
        Schema::create('navigation', function (Blueprint $table) {
            $table->engine = 'InnoDB';
            $table->increments('id')->unsigned();
            $table->integer('position')->unsigned();
            $table->string('title');
            $table->string('slug');
            $table->string('permissions')->nullable();
            $table->timestamps();
            $table->softDeletes();
        });
    }

    public function down()
    {
        Schema::drop('articles');
    }
}

然后因为我在这里读了几个 post 像 this, this, this 和更多我用下面的代码创建了另一个文件,只包含名为 2016_08_02_030158_add_parent_to_navigation_table.php 的关系:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddParentToNavigationTable extends Migration
{
    public function up()
    {
        Schema::table('navigation', function (Blueprint $table) {
            $table->foreign('parent_id')->references('id')->on('navigation')->onUpdate('cascade')->onDelete('cascade');
        });
    }

    public function down()
    {
        Schema::drop('articles');
    }
}

但是当我 运行 命令 php artisan migrate 时出现以下错误,我不确定我做错了什么:

[Illuminate\Database\QueryException] SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'navigation' already exists (SQL: create table navigation (id int unsigned not null auto_increment primary key, position int unsigned not null, title varc har(255) not null, slug varchar(255) not null, permissions varchar(255) null, created_at timestamp null, updated_at timestamp null, deleted_at timestamp null) default character set utf8 collate utf8_unicode_ci engin e = InnoDB)

[PDOException] SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'navigation' already exists

可以给我一些建议吗?我做错了什么?我已经看到 this package 但我不确定它是否能解决我的问题。

SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'navigation' already exists

表示你在数据库中有相同的table名字

所以你需要验证一下,你的数据库中没有任何tablename

  • 确保没有 table 同名的名字
  • 运行再次迁移

    php artisan migration:rollback 有时由于不同的原因无法删除 table。