Сложные отношения в Laravel (hasManyThrough через сводную таблицу) - PullRequest
0 голосов
/ 14 ноября 2018

Итак, у меня четыре таблицы.

  • 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;
    });
}

Но я получаю ошибку, потому что это нене возвращает отношения, а скорее коллекцию.

Я также пытался использовать решение , найденное здесь .Но я не мог заставить его работать должным образом, потому что их модель немного отличается от моей.(У каждого продукта есть много skus, а не наоборот.)

Другим решением было включить третий столбец в sku_attribute s для product_id, но я не смог найти способ по умолчанию заполнить это дляsku->product->id по методу $sku->attach($attribute_id).Вместо этого мне придется каждый раз вручную вызывать это, например $sku->attach($attribute_id, ['product_id' => $sku->product->id]).

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

В 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']);
    }
}
0 голосов
/ 21 ноября 2018

Это сработало для меня.

public function attributes()
{
    return $this->skus->flatMap(function ($sku) {
        return $sku['attributes'];
    });
}
0 голосов
/ 14 ноября 2018

Вы можете попробовать что-то вроде

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 для продуктов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...