是否可以在Laravel中的String / varchar类型列上的两个表之间创建外键关系?

时间:2017-07-12 11:06:12

标签: mysql database laravel laravel-5 laravel-5.4

我有一个类别表,它有一个id和一个slug(varchar类型)列。我想创建一个子类别表,它将有一个category_slug(varchar类型)列,它将引用Category表中的slug列。 / p>

我在php artisan migrate期间遇到错误。

    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]:一般错误:   1005无法创建表laravel_eshopper#sql-ee8_272(错误:   150"外键约束形成错误")(SQL:alter table   tabpanes添加约束tabpanes_category_slug_foreign外来   密钥(category_slug)引用categoriesslug))

     

[PDOException] SQLSTATE [HY000]:常规错误:1005无法创建   表格1}}。 laravel_eshopper(错误:150"外键   约束形成错误")

1 个答案:

答案 0 :(得分: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();
  });