2017-07-12 43 views
0

我有一个类别表有一个id和一个slug(varchar类型)列。我想要创建一个子类别表,它将有一个列category_slug(varchar类型),它将引用类别表中的slug列。是否有可能在Laravel的String/varchar类型列上的两个表之间创建外键关系?

我在使用php artisan迁移时出现错误。

Schema::create('subcategories', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('category_slug')->unique(); 
     $table->integer('product_id'); 
     $table->foreign('category_slug') 
     ->references('slug')->on('categories'); 
     $table->timestamps(); 
    }); 

终端中的错误是。

[Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1005 Can't create table laravel_eshopper . #sql-ee8_272 (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table tabpanes add constraint tabpanes_category_slug_foreign foreign key (category_slug) references categories (slug))

[PDOException] SQLSTATE[HY000]: General error: 1005 Can't create table laravel_eshopper . #sql-ee8_272 (errno: 150 "Foreign key constraint is incorrectly formed")

+0

为什么这种类型的数据库设计? –

+0

子类别表中还有另外一列'product_id'。我已经编辑过这个帖子,它存储了产品表中的产品id。我希望任何人都能看到子类别表,可以很容易地理解哪个产品属于哪个类别。一个外键关系将帮助我轻松地在子类别表格中插入数据,因为所有的slug在从phpmyadmin插入子类别表格时将作为下拉菜单来下载。 –

+0

为什么您需要为'子类别'创建另一个表格,则可以在'类别'中创建'parent_id'。 –

回答

1

是当然,你可以做到这一点,请参见下面的例子:

假设你有你的类别表如下:

Schema::create('categories', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('slug')->unique(); 
     $table->timestamps(); 
    }); 

现在你可以创建一个外键子类别如下:

Schema::create('subcategories', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('category_slug')->unique(); 
     $table->foreign('category_slug') 
     ->references('slug')->on('categories')->onUpdate('cascade') 
     ->onDelete('cascade'); 
     $table->timestamps(); 
    }); 
+0

谢谢!我在分类表中的slug列没有被定义为唯一的。 –

相关问题