2016-09-22 5 views
9

Die Modellstruktur ist alsLaravel 5.3 withCount() verschachtelte Beziehung

Tutorial folgt -> (hasMany) Chapters -> (hasMany) Videos

Wie können wir Reihe von Videos laden (VIDEO_COUNT) aus Tutorial Modell mit Laravel 5.3 des withCount() -Methode

ich habe versucht:

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

bearbeiten

Dies funktioniert, jede bessere Lösung?

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

Haben Sie Beziehung in Modelle definieren? –

+0

Sie müssen nur eins machen -> withCount ('chapters.videos'). Stellen Sie außerdem sicher, dass Ihre Beziehungen ordnungsgemäß festgelegt sind. –

+0

@DigitalFire Beziehungen sind korrekt, da ich sie mit eifrigem Laden laden kann. count() Methode – crazy1337

Antwort

14

Sie können eine withCount() auf einer definierten Beziehung des Modells nur tun.

Eine Beziehung kann jedoch hasManyThrough sein, die erreichen würde, wonach Sie suchen.

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

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

Und dann können Sie tun:

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

Docs:

+0

Vielen Dank! Ich denke nicht, dass es so viel einfacher ist. – july77

+0

Danke für die Antwort. Hat mir auf jeden Fall geholfen, die Leistung zu verbessern. –