Laravel,在多对多表中具有属性的产品

时间:2017-06-01 08:38:14

标签: mysql database laravel database-design

我正在构建一个供应商可以添加产品的平台,而店主可以复制'那些产品到他们的商店出售。

供应商可以创建产品,他可以为它们添加各种属性,例如尺寸,颜色。

当商店想要使用其中一个供应商的产品时,他可以选择他想要提供的属性。例如,如果供应商提供3种尺寸的T恤。该商店可能会选择仅出售2种尺寸的T恤。

所以我有一个产品表,看起来像这样。供应商在此处添加产品。

+----+-------------+-------+
| id | description | price |
+----+-------------+-------+
|  1 | T-Shirt     |    10 |
|  2 | Car         |   100 |
+----+-------------+-------+

我有一个产品属性表,也由供应商填写

+------------+-------------+------------------------------+
| product_id | description |           options            |
+------------+-------------+------------------------------+
|          1 | size        | ["small", "medium", "large"] |
|          1 | color       | ["white", "black"]           |
+------------+-------------+------------------------------+

Shop Side

当店主想要产品时。我在shop_products表中记录,引用哪个商店想要什么产品,并添加一个可选图像,如下所示

+---------+------------+-----------+
| shop_id | product_id |   image   |
+---------+------------+-----------+
|       1 |          2 | image.jpg |
|       1 |          3 | image.jpg |
+---------+------------+-----------+
  

现在唯一的问题是:如何确保商店可以选择他想要的属性。

  • 我应该创建一个shop_product_attributes表..但我不能在多对多关系中建立关系,因为它没有id?

2 个答案:

答案 0 :(得分:2)

如果它可以改变你的数据库结构我会这样做,我知道它对你所拥有的有点改变,但我认为你必须把产品视为一种关系,这是因为虽然是-shirt是一个产品,实际的T恤黑色介质是一个完全不同的产品,T恤黑色小,你的供应商几乎肯定会以这种方式引用它们

您的产品表看起来像这样,但它不是您的主要表引用产品,这包含产品将具有的通用内容,例如描述 或者名字

+----+-------------+-------+-----------+-------------+
| id | name        | price | image     | description |
+----+-------------+-------+-----------+-------------+
|  1 | Super-T     |    10 | image.jpg | some text   |
|  2 | Focus       |   100 | image.jpg | some text   |
+----+-------------+-------+-----------+-------------+

你的主表是一张sku表,想到这是你的产品,如果你有任何sku特定的东西你会把它们放在这里

+----+-------------+------------+--------------+
| id | sku         | product_id |  category    |
+----+-------------+------------+--------------+
|  1 | p1-cb-m     |    1       | t-shirt      |
|  2 | p2-cb-s     |    2       | t shirt      |
+----+-------------+------------+--------------+

然后有一个attributes_sku表,这会将sku链接到属性

+---------------+--------------+
| sku_id        | attribute_id |
+---------------+--------------+
| 1             |    1         |
| 1             |    2         |
+---------------+--------------+

规范化的属性

+----+-------------+------------+
| id | type        | name       |
+----+-------------+------------+
|  1 | color       |    black   |
|  1 | size        |    medium  |
+----+-------------+------------+

购买Sku表

+---------+------------+
| shop_id | sku_id     | 
+---------+------------+
|       1 |          1 |
|       1 |          2 |
+---------+------------+
这样做的好处就是你可以做到 foreach $shop->skus where category = t-shirt展示他们所有的T恤

然后你可以做$ skus-> product-> name $skus->product->attribute->name或者更好的是在sku模型上设置关系为color $this->attribute->where('type', color);

请注意 一个小注释我通过使用类别和类型表进一步规范化,因此您的属性类型实际上是type_id,它是类型表的属性关系,而您的sku类别将是category_id,属于类别表,将来如果您的类别或类型决定更改名称,您不必编辑1000条记录等

答案 1 :(得分:0)

实际上,您可以在 shop_product_attributes 表格中创建多对多关系。

由于产品属性表格中包含compound key个2个字段:[product_id,description],您的多对多关系将具有三键 - {{1}其中[shop_id,product_id,description]也用作引用外键。