Laravel - 只有外键的表格模型(数据透视表)

时间:2014-09-16 05:46:08

标签: php mysql laravel-4

我需要为只有两个外键的表实现模型。在我的数据库中,我有这样的表:

product (id_product, ...)
category_to_product (FK id_category, FK id_product)
category (id_category, ...)

如何在Laravel中管理此连接?我应该为合并表实现模型以及它看起来如何? category_to_product表不表示实体(/ model),只有设计关系属性。

database-model


数据库迁移

CategoryToProduct

Schema::create('category_to_product', function(Blueprint $table)
{
    $table->integer('id_category')->unsigned();
    $table->foreign('id_category')
          ->references('id_category')
          ->on('categories')
          ->onDelete('cascade');
    $table->integer('id_product')->unsigned();
    $table->foreign('id_product')
          ->references('id_product')
          ->on('products')
          ->onDelete('cascade');
});

产品

Schema::create('products', function(Blueprint $table)
{
  $table->increments('id_product');
  // ...
});

分类

Schema::create('categories', function(Blueprint $table)
{
  $table->increments('id_category');
  // ...
});

2 个答案:

答案 0 :(得分:2)

@ pc-shooter关于创建方法是正确的。

但您仍然需要首先使用迁移创建数据透视表

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

然后你的数据透视表

Schema::create('category_product', function(Blueprint $table)
{
    $table->integer('category_id')
    $table->foreign('category_id')->references('id')->on('categories');

    $table->integer('product_id');
    $table->foreign('product_id')->references('id')->on('products');

    // And finally, the indexes (Better perfs when fetching data on that pivot table)
    $table->index(['category_id', 'product_id'])->unique(); // This index has to be unique
}

答案 1 :(得分:1)

执行以下操作:

在模型类别

public function products(){
    return $this->belongsToMany('Category');
}

在模型产品

public function categories(){
    return $this->belongsToMany('Category', 'category_to_product');
}

在模型 CategoryToProduct

public function categories() {
    return $this->belongsTo('Category');
}

public function products() {
    return $this->belongsTo('Product');
}

请注意这些方法的命名!  这些与DB表名称相同。见ChainList 答案。