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

时间:2016-08-02 03:19:05

标签: laravel laravel-5.2 laravel-migrations laravel-schema-builder

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

这就是文件2016_08_02_024942_create_navigation_table.php的样子(我已删除评论,因为帖子不太长):

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

然后因为我在这里阅读了几篇帖子,例如thisthisthis等等,我创建的另一个文件只包含名为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]:基表或   视图已存在:1050表'导航'已存在(SQL:   create table navigationid int unsigned not null auto_increment   主键,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)默认字符集utf8 collat​​e   utf8_unicode_ci engin e = InnoDB)

     

[PDOException] SQLSTATE [42S01]:基表或视图已存在:   1050表'导航'已存在

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

1 个答案:

答案 0 :(得分:1)

  

SQLSTATE [42S01]:基表或视图已存在:1050表   '导航'已存在

表示您在数据库中具有相同的表名

因此,您需要验证,数据库中没有名称

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

    php artisan migration:rollback由于各种原因,有时无法删除表格。