Laravel中的复杂关系(通过数据透视表有很多)

时间:2018-11-14 14:18:53

标签: laravel laravel-5 eloquent

所以我有四个表。

  • products
  • skus
  • sku_attribute
  • attributes

每个product有许多sku。每个sku有许多attribute。每个attribute可以具有多个与其关联的skusku_attributeskuattribute之间多对多关系的数据透视表。

这很好!但是现在,我如何获得与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

3 个答案:

答案 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'];
    });
}