所以我有四个表。
products
skus
sku_attribute
attributes
每个product
有许多sku
。每个sku
有许多attribute
。每个attribute
可以具有多个与其关联的sku
。 sku_attribute
是sku
和attribute
之间多对多关系的数据透视表。
这很好!但是现在,我如何获得与attribute
关联的所有product
?
以下代码对我有用。
public function attributes()
{
return $this->skus->flatMap(function ($sku) {
return $sku->attributes;
});
}
但是我收到一个错误,因为它不会返回关系,而是一个集合。
我也尝试使用solution found here。但是我无法使其正常工作,因为它们的模型与我的模型略有不同。 (每种产品都有很多缺点,反之亦然。)
另一种解决方法是在sku_attribute
的{{1}}上添加第三列,但我找不到默认方法将其填充到{{1}上的product_id
} 方法。取而代之的是,我每次都必须手动调用它,例如sku->product->id
。
答案 0 :(得分:0)
您可以尝试类似
public function attributes()
{
return Attributes::whereIn('id', function($query){
return $query->whereHas('skuAttributes', function($query) {
return $query->whereHas('products', function($query) {
return $query->where('id', $this->id);
);
});
});
}
然后在skuAttributes模型上为产品创建hasManyThrough。
答案 1 :(得分:0)
Laravel中没有对此的本地支持。
我为此创建了一个包:https://github.com/staudenmeir/eloquent-has-many-deep
您可以使用以下关系:
class Product extends Model
{
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
public function attributes()
{
return $this->hasManyDeep(Attribute::class, [Sku::class, 'sku_attribute']);
}
}
答案 2 :(得分:0)
这最终为我工作。
public function attributes()
{
return $this->skus->flatMap(function ($sku) {
return $sku['attributes'];
});
}