2014-02-06 3 views
4

У меня есть следующие модели:Возможно ли иметь отношения HasManyThrough, которые глубже двух уровней?

Product 
BaseProduct 
BaseCode 
Series 

Каждый из них является то, что отдельного лица, но они связаны между собой.

Product имеет внешний ключ к BaseProduct, BaseProduct имеет внешний ключ к BaseCodeBaseCode и имеет внешний ключ к Series.

Я уточнял метод в моей BaseCode модели, так что я могу выбрать все Products, которые связаны с этой конкретной BaseCode:

public function Products() 
{ 
    return $this->hasManyThrough('Product', 'BaseProduct', 'BaseCodeId', 'BaseProductId'); 
} 

BaseCodeId является PK для BaseCode и FK в BaseProduct что указывая на это ПК, а BaseProductId - это ПК на BaseProduct, а в таблице Product есть FK, который указывает на него.

Это все хорошо и хорошо, и для меня работает только денди.

Я хотел бы пойти на один уровень дальше, хотя, и определить что-то вроде следующего в моей Series модели:

public function Products() 
{ 
    //It's here that I'd have no idea what to do - is there something like a three-level deep "hasManyThroughThrough" or something? 
    return $this->BaseProducts()-> /* and then whatever I'd do here to get the products */ 
} 

public function BaseProducts() 
{ 
    return $this->hasManyThrough('BaseProduct', 'BaseCode', 'SeriesId', 'BaseCodeId'); 
} 

Как получить все Product с связанных с Series, как это?

ответ

6

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

Попробуйте традиционную жадную загрузку вместо ...

$data = Product::with('BaseProduct.BaseCode.Series');

Вам нужно будет убедиться, что отношения могут быть сконфигурированы в моделях по мере необходимости, и вместо вызова названия моделей, вы хотите, чтобы вызвать методы которые определяют отношения.

Кроме того, очевидно, быть уверены, что ваши модели знают, что первичные ключи с помощью protected $primaryKey = 'SeriesID' и т.д ...

+1

Спасибо, сэр. После того, как я начал тяжело копаться и возиться, я не смог получить «Красноречивый», чтобы согнуться, как мне хотелось бы, и пришел к такому же выводу. –

Смежные вопросы