【问题标题】:Is there an elegant way of structuring a series of three Eloquent models that are components of each other?有没有一种优雅的方式来构建一系列三个相互组成的 Eloquent 模型?
【发布时间】:2020-10-11 06:17:16
【问题描述】:

这是一个有趣的问题,但我希望就如何最好地构建几个 Eloquent 模型及其关系得到一些建议。

总结

我正在尝试创建一个最优雅地表示一组产品、组件和零件的结构,并允许我计算产品和组件的成本。

  • App\Part是从第三方购买的,所以会以单位成本插入到数据库中。

  • App\Component 由零件组成(即:组件belongsToMany() 零件,反之亦然)。组件的成本是 App\Part 价格的总和,但该部分也可以直接出售给客户。

  • App\Product两个部件组件组成,成本为App\PartApp\Component 成本的总和;因此,部件和组件belongsToMany() 产品。

产品和组件共享许多相同的数据字段,例如程序方法(构建产品/组件的说明)、销售价格等。

将零件想象成一个螺栓或一块木材,可用于制作桌腿(组件),然后可用于创建任意数量的不同类型的桌子(产品)。该零件可以直接由产品由用于制造产品的组件使用。

我的考虑

到目前为止,我已经提出了两种不同的方法,但看起来都不是很干净,所以我希望有人可以引导我走向更好的方向:

  1. 利用App\Part 上的多态关系,使其与App\ComponentApp\Product 相关,然后在App\ProductApp\Component 之间建立多对多关系。组件必须记录其计算的单位成本,然后在计算产品成本时,我可以将零件和组件的成本相加,并添加它们。

  2. 创建App\Component 时,将其引用添加回parts 表中作为零件,即:桌腿由两块不同的木材和一些螺丝制成(我不知道,我'我不是木匠)。然后,一旦在parts 表中创建了table leg 的条目,App\Product 只需要与 Parts 建立多对多关系。

这些方法中的任何一种都不适合我,因此我非常感谢任何有任何建议的人或任何过去可能解决过类似问题的人的建议。

【问题讨论】:

    标签: laravel eloquent data-modeling


    【解决方案1】:

    除了组件是由零件组成的以外,还不清楚组件和零件之间的区别。例如,如果您说一个零件可以是与自身相关的基础零件或复合零件,那是否会摆脱对组件的需求?如果是这种情况,这是您可以实际做的事情:

    说你的桌子是

    parts
    -----
    id | name | cost 
    
    part_parts
    -----
    base_part_id | composite_part_id
    
    

    您可以将零件模型定义为:

    class Part extends Model {
       protected $with [ 'consistsOfParts' ]; 
       protected $appends = [ 'total_cost' ];
    
       public function consistsOfParts() {
           return $this->belongsToMany(Part::class, 'part_parts', 'composite_part_id', 'base_part_id');
       }
    
       public function constintuentOfParts() {
           return $this->belongsToMany(Part::class, 'part_parts', 'base_part_id', 'composite_part_id');
       }
    
       public function getTotalCostAttribute() {        
            return $this->consistsOfParts->sum('cost') + $this->cost;
       }
     
    }
    

    应该通过允许您计算产品的总成本来简化事情,例如$product->parts->sum('total_cost');

    请注意,这将强制急切加载相关部分,因此可能会在每个检索到的产品中产生额外的查询。

    然后,您可以使用多态性(如果需要)通过检查(或存储为列)部件是基本部件还是复合部件来区分部件和组件。

    【讨论】:

    • 感谢您的回复!我应该更清楚零件和组件之间的区别。区别实际上在于表中的其余数据。在我看来,产品和组件是零件列表、构建它们的程序方法,而零件是购买的东西,因此其余列会有不同的数据,例如:品牌、包装尺寸、计量单位、等等。不过,我很确定我会遵循你的建议,所以我会试一试,看看它是否能成功。
    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多