【发布时间】:2014-10-29 16:01:24
【问题描述】:
我有 3 个模型:Basket、Product 和 Asset。
一个Basket可以包含多个Assets,一个资产可以出现在多个Baskets中。
一个Product 可以有多个Asset,但一个Asset 也可以分配给多个Product。
目的是将Assets 转换为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; 之类的电话来获取将第一个资产添加到购物篮的产品。
【问题讨论】:
-
如果我理解正确的话,关系的“多”部分实际上有点用词不当——它们的工作方式受到限制。即,给定一个
asset和product组合,将始终只有一个product匹配(不管事实上assets 拥有并属于products 和baskets,等等)所以,如果是这样的话,我们有一些工作要做(但你能确认一下吗?)。但是,使用普通的 Eloquent 关系是不可行的,因为给定的asset实例不知道它是从潜在的许多baskets 中检索到的。 -
@JarekTkaczyk 我认为看起来很理想 - 有没有办法在 Composer 中轻松使用它?
-
@alexrussell 调用
Asset::find(1)->products应该返回分配给Asset的所有Products。调用Basket::assets()->first()->products应该做同样的事情(注意复数->products。调用Basket::assets()->first()->product应该返回ProductAsset附加到Basket与(注意单数->product)。跨度> -
是的,但您必须意识到从
$basket->assets()返回的Assets 实际上并不知道您要求的原始basket的任何内容。这就是为什么你不能使用传统的 Eloquent 关系来获得你想要的东西的原因。如果在Basket#assets()中使用->withPivot('product_id'),则asset将拥有来自数据透视表的原始product_id。从那里,您应该能够使用它来获取该资产的(单个)product。那有意义吗?但我认为你仍然必须手动完成这项工作。
标签: php laravel eloquent relationship