2016-09-22 49 views
9

Struktura modelu jest następującalaravel 5,3 withCount() zagnieżdżone relacja

Tutorial -> (hasMany) Rozdziały -> (hasMany) Filmy

Jak możemy załadować liczbę filmów (VIDEO_COUNT) od Tutorial Modelu z laravel 5,3 za withCount() metoda

próbowałem:

Tutorial::withCount('chapters') 
->withCount('chapters.videos') // this gives error: Call to undefined method Illuminate\Database\Query\Builder::chapters.videos() 
->all(); 

Edycja

To działa, jakieś lepsze rozwiązanie?

Tutorial::withCount('chapters') 
->with(['chapters' => function($query){ 
    $query->withCount('videos'); 
}]) 
->all(); 
+0

Czy można zdefiniować relacje w modelach? –

+0

Należy wykonać tylko jeden -> withCount ("chapters.videos"). Upewnij się również, że twoje relacje są ustawione prawidłowo. –

+0

@DigitalFire Relacje są poprawne, ponieważ mogę załadować je z dużym obciążeniem. just count nie zapełnia się metodą withCount() – crazy1337

Odpowiedz

14

można tylko zrobić withCount() na określonym stosunku modelu.

Jednak związek może być hasManyThrough, który pozwoliłby osiągnąć to, czego szukasz.

class Tutorial extends Model 
{ 
    function chapters() 
    { 
     return $this->hasMany('App\Chapter'); 
    } 

    function videos() 
    { 
     return $this->hasManyThrough('App\Video', 'App\Chapter'); 
    } 
} 

A potem można zrobić:

Tutorial::withCount(['chapters', 'videos'])

Docs:

+0

Dziękuję bardzo! Nie wydaje mi się to takie proste. – july77

+0

Dzięki za odpowiedź. Zdecydowanie pomógł mi poprawić wydajność. –