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`))
有人能指出我的错误吗?如果错误不是自我引用会很酷......;)
问候
我总是将我的关系建立在与迁移中的创建相同的方法中。我不认为Silencesys的答案是正确的。
我实际上认为问题的一个重要部分是你的实现。
使用外键引用同一个表上的主键,很多SQL功能都会中断。 (例如Cascade)。
你可能最好不要弄清楚如何将你正在做的事情分成两个不同的模型。
我能在这里真正提出的唯一解决方案就是创建一个“数据透视表”,它基本上只是将同一个表连接在一起。
shop_id | shop_parent_id
2 | 1
3 | 4
编辑:这种方法不起作用,所以我认为我的第二个建议与数据透视表是唯一的选择。或者您只能在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');
});
或创建一个数据透视表,你将存储关系,我认为这可能是一个更好的方法,因为那样你不仅限于每个孩子一个父类别。
你能试试吗?
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');
});