如何处理与 Laravel 的复杂关系?

Posted

技术标签:

【中文标题】如何处理与 Laravel 的复杂关系?【英文标题】:How do I handle complex relations with Laravel? 【发布时间】:2021-10-07 00:31:32 【问题描述】:

虽然非常感谢基于代码的答案,但我有兴趣了解处理此问题背后的逻辑,因为以后可能会再次发生。

我正在做一个电子商务项目。大多数产品都是变量。例如想象一件衬衫。

一件衬衫可以有 5 种不同的尺码(XS、S、M、ML、L)和 3 种颜色(红、绿、蓝)。这些是示例,这些属性是动态的,可以随时编辑。我的方法是为产品本身创建 3 个不同的表:

- main_product_table
    - id

- product_variant_table
    - id
    - main_product_id

- product_variant_combination_table
    - id
    - variant_id
    - attribute_name_id
    - attribute_value_id

还有 2 个属性表:

- attribute_name_table
    - id
    - attribute_name

- attribute_value_table
    - id
    - attribute_value

因此,例如,上述衬衫现在将创建以下记录:

attribute_name_table 中有 2 条记录 attribute_value_table 中有 3 条记录 main_product_table 中有 1 条记录 product_variant_table 中的 3x5 条记录 product_variant_combination_table 中的 2x3x5 条记录(2 行,每行包含 1 个属性的值)

现在考虑查询所有包含 XS 尺寸的产品,或查询该产品及其所有变体数据。

我的问题是:

    雄辩的模型可以处理这个问题吗? 如果是这样,我应该创建 5 个模型,每个表 1 个吗? 如果不是,我应该创建一个(或 2 个)模型(产品、属性)并使用自定义 SQL 和方法连接它们吗? 这里有什么关系?属性对我来说似乎是一对多的,但组合似乎也是一对多的,而且这两者也相互关联。

我很难理解上述之间的关系。通过 SQL 似乎可以理解,但我无法通过 Eloquents 将它们相互关联。

此外,表格似乎迅速增长。这种方法是否正确?

【问题讨论】:

【参考方案1】:

从长远来看,您的方法似乎很难维持。我不明白您为什么必须将 name 属性与 value 分开。

我将创建产品型号、尺寸和颜色及其迁移和数据透视表来存储库存

- size_table
-- id
-- name

- color_table
-- id
-- name

- product_table
-- id
-- type (shirt, pants, pullover ... etc.)
-- description
-- status

- stock_table
-- product_id (reference to the product table)
-- color_id (Reference to the color table)
-- size_id (Reference to the size table)
-- quantity (Quantity of products available with these attributes)
-- status

这样您就可以在 stock_table 中存储多个组合的相同产品。

现在您只需要定义每个模型之间的关系,然后您就可以访问 product_detail_table 中的所有属性

$item->quantity
$item->product->description
$item->size->name
$item->color->name

【讨论】:

谢谢,但不幸的是,这个答案没有帮助。尺寸和颜色只是示例。属性是动态的,它们不能绑定到列。此外,它们的值是分开的以保持标准化。否则你最终会得到大量重复数据。

以上是关于如何处理与 Laravel 的复杂关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理与节点 ID 对应的响应对象?

如何处理与 python 套接字的断开连接? (连接重置错误)

如何处理与 AWS AppSync 离线同步的数据?

如何处理与派生类不兼容的基类方法?

如何处理与Apache HttpClient的无效SSL证书

如何处理与 .NET WPF 应用程序具有 OCX 依赖项的 VB6 ActiveX dll 的对话