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

标签 mysql database laravel database-design

我正在构建一个平台,供应商可以在其中添加产品,店主可以将这些产品“复制”到他们的商店并进行销售。

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

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

所以我有一个看起来像这样的 Products 表。供应商在这里添加产品。

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

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

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

店面

当店主想要产品时。我在shop_products表中做记录,引用哪个Shop要什么Product,并添加一个可选的图片,如下

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

Now the only issue remaining is: How do I make sure the Shop can choose which attributes he wants to take.

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

最佳答案

如果可以更改您的数据库结构,我会这样做,我知道这对您所拥有的有所改变,但我认为您必须将产品视为一种关系,这是因为尽管 t -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 模型上设置一个关系为颜色 $this->attribute->where('type', color) ;

备注 一个小提示,我会通过一个类别和类型表进一步规范化,所以你的属性类型实际上是一个 type_id,它是一个类型表的归属关系,而你的 sku 类别将是一个类别_id,到一个类别表,如果您的类别或类型决定更改名称,那么将来就是这样,您不必编辑 1000 条记录等

关于mysql - Laravel,多对多表中具有属性的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44302542/

相关文章:

php - Laravel 电子邮件模板样式

php - 通过电子邮件显示输出但不更新数据库中的记录的用户批准

用于处理多个连接的 PHP 脚本

mysql - : SELECT WITH VAR inside MySQL 的右 sinxats

mysql - 连接多个表中的列

php - Laravel Eloquent - 混合了 snake_case 和 camelCase 列的现有数据库

php - Laravel Eloquent $model->save() 不保存但没有错误

php - Ajax 发布带有数字但不带有字母的字符串

MySql 语法(Join、UNION ALL)?

javascript - 当有数据库调用时,调用验证 Jscript 函数的正确方法是什么?