Laravel 5.8同桌上的外国关系

问题描述 投票:0回答:3

ERoad

我正在尝试使用Laravel 5.8迁移在同一个表上创建外部关系。该表的代码如下所示:

Schema::create('categories', function (Blueprint $table){
        $table->bigIncrements('id');
        $table->unsignedBigInteger('shop_id');
        $table->unsignedBigInteger('shop_parent_id');
        $table->string('name');
        $table->unsignedBigInteger('synctime');
        $table->timestamps();

        $table->foreign('shop_parent_id')->references('shop_id')->on('categories');
    });

正如您所看到的,我已经确定,两列都具有相同的数据类型,但我仍然保持原样:

 SQLSTATE[HY000]: General error: 1005 Can't create table `mydatabase`.`categories` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `categories` add constraint `categories_shop_parent_id_foreign` foreign key (`shop_parent_id`) references `categories` (`shop_id`))

有人能指出我的错误吗?如果错误不是自我引用会很酷......;)

问候

sql laravel migration
3个回答
0
投票

我总是将我的关系建立在与迁移中的创建相同的方法中。我不认为Silencesys的答案是正确的。

我实际上认为问题的一个重要部分是你的实现。

使用外键引用同一个表上的主键,很多SQL功能都会中断。 (例如Cascade)。

你可能最好不要弄清楚如何将你正在做的事情分成两个不同的模型。


我能在这里真正提出的唯一解决方案就是创建一个“数据透视表”,它基本上只是将同一个表连接在一起。

shop_id | shop_parent_id

2         |           1

3         |           4


0
投票

编辑:这种方法不起作用,所以我认为我的第二个建议与数据透视表是唯一的选择。或者您只能在Laravel模型中定义关系,因为它无论如何都会起作用。

原始答案:

我认为你应该把它分解为两个架构查询:

Schema::create('categories', function (Blueprint $table){
        $table->bigIncrements('id');
        $table->unsignedBigInteger('shop_id');
        $table->unsignedBigInteger('shop_parent_id');
        $table->string('name');
        $table->unsignedBigInteger('synctime');
        $table->timestamps();
});

Schema::table('categories', function($table) {
        $table->foreign('shop_parent_id')->references('shop_id')->on('categories');
});

或创建一个数据透视表,你将存储关系,我认为这可能是一个更好的方法,因为那样你不仅限于每个孩子一个父类别。


0
投票

你能试试吗?

Schema::create('categories', function (Blueprint $table){
    $table->bigIncrements('id')->unsigned()->unique();
    $table->unsignedBigInteger('shop_id')->unsigned();
    $table->unsignedBigInteger('shop_parent_id')->unsigned()->nullable();
    $table->string('name');
    $table->unsignedBigInteger('synctime');
    $table->timestamps();
    $table->primary(['id']);
});

Schema::table('categories', function($table) {
    $table->foreign('shop_parent_id')->references('shop_id')
              ->on('categories'); 
});
© www.soinside.com 2019 - 2024. All rights reserved.