我已经浏览了几十个 Eloquent 问题,但是这些例子通常很容易掌握。例如,一个用户有一个电话或一个类别有很多帖子。
我正在尝试存储产品功能并在它们之间建立关系,同时保持数据库尽可能接近规范化,否则很容易将每个组合及其数据存储在一行中。
考虑一个产品,它可以具有许多特征(材料、尺寸、重量、颜色等)。分配给产品的每个特征只能有一个值,例如,材料是木材。
为了避免重复条目,我将功能和值保存在单独的表中。因为例如 Wood 可以被 Material 和 Texture 使用。
这是我的数据库结构:
feature
- id
- name ( E.g. Material )
feature_value
- id
- value ( E.g. Wood, must be unique )
feature_value_combination
- id
- id_feature
- id_value
product_feature
- id
- id_product
- id_combination
Run Code Online (Sandbox Code Playgroud)
这样我也可以将它们分组并防止重复。但是我很难理解这些之间的关系,因为很多关系都可以工作。我的问题是:
feature value属于一个组合,也有一个组合,同时属于一个特征名称和一个产品,而且一个产品也可以有一个特征,一个值,一个组合。这里的一切似乎都混乱了。对澄清这一点的任何帮助表示赞赏。
我设法设置了基本关系,但代价是创建 5 个模型,即使是数据透视表也是如此。
楷模:
现在我可以使用以下方法获取产品及其功能数据:
Product
::where( 'id', $id )
->with( 'getM5data.getM4data.getM3data')
->get();
Run Code Online (Sandbox Code Playgroud)
我使用了短名称以使其更易于阅读。这些方法中的每一个都使用关系获取所需的数据。然而,这会导致 5 个查询,这是令人憎恶的:
select * from `products` where `id` = 1
select * from `product_feature_relations` where `product_feature_relations`.`id_product` in (1)
select * from `product_feature_name_value` where `product_feature_name_value`.`id` in (2, 3)
select * from `product_feature_values` where `product_feature_values`.`id` in (4, 5)
select * from `product_feature_names` where `product_feature_names`.`id` in (6, 7)
Run Code Online (Sandbox Code Playgroud)
这可以使用内部联接和 2 个查询轻松完成。我不知道如何将上面的转换为这个。
| 归档时间: |
|
| 查看次数: |
32 次 |
| 最近记录: |