嘿,
我正在尝试使用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`))
有人可以在这里指出我的错误吗?如果错误不是自指的,那将很酷...;)
问候
答案 0 :(得分: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');
});
或创建一个用于存储关系的数据透视表,我认为这可能是一种更好的方法,因为这样一来,您就不仅限于每个孩子一个父类别。
答案 1 :(得分:0)
在迁移过程中,我始终将关系建立在与创建关系相同的方法中。我认为Silencesys的答案不正确。
我实际上认为问题的很大一部分是您的实现。
在外键引用同一张表上的主键的情况下,许多SQL功能都中断了。 (例如,级联)。
您最好弄清楚如何将正在做的事情分成两个不同的模型。
在这里我真正能想到的唯一使您当前结构保持完整的解决方案是创建一个“透视表”,该表实际上只是将同一张表一起旋转。
shop_id | shop_parent_id
2。 1
3 | 4
答案 2 :(得分: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');
});