2014-10-29 109 views
0

我有3个机型:BasketProductAssetLaravel关系-3路表

A Basket可以包含许多Asset s,并且一个资产可以出现在多个Basket s中。

A Product可以有多个Asset s,但Asset也可以分配给多个Product

目标是将Asset s变成Basket,同时仍然知道它是从哪个Product中添加的。


我设想有表结构是这样的:

------------------------------------- 
| basket_id | asset_id | product_id | 
------------------------------------- 
|   1 |  1 |   1 | 
|   1 |  3 |   1 | 
|   1 |  15 |   2 | 
|   2 |  23 |   1 | 
|   2 |  3 |   1 | 
|   3 |  79 |   3 | 
------------------------------------- 

我还想象的是这样一种模式设置:

class Basket extends Eloquent { 
    public function assets() { 
     return $this->belongsToMany('Asset'); 
    } 
} 

class Product extends Eloquent { 
    public function assets() { 
     return $this->belongsToMany('Asset'); 
    } 
} 

class Asset extends Eloquent { 
    public function products() { 
     return $this->belongsToMany('Product'); 
    } 

    public function product() { 
     // This should return the product from the product_id column 
    } 
} 

我不知道如何去编写Asset::product(),以便它返回相应的Product

我想调用类似Basket::find(1)->assets()->first()->product;的产品,以获得第一个资产添加到购物篮的产品。

+0

试试这个https://github.com/ jarektkaczyk/Eloquent-triple-pivot – 2014-10-29 16:09:40

+0

如果我正确地理解了你的这种关系中的'多'部分实际上是一种误称 - 它们的工作方式有一些限制。也就是说,给定一个“资产”和“产品”组合,总是只有一个“产品”匹配(无论一般情况下,“资产”是否属于“产品”和“篮子” s等)所以,如果是这种情况,我们有一些工作(但你能确认吗?)。然而,使用正常的Eloquent关系是不可行的,因为给定的“资产”实例不知道它从哪个潜在的多个“篮子”中检索。 – alexrussell 2014-10-29 16:35:10

+0

@JarekTkaczyk看起来很理想我想 - 有没有什么方法可以在Composer中轻松使用? – Joe 2014-10-29 16:38:36

回答