44

The model structure is as follows

Tutorial -> (hasMany) Chapters -> (hasMany) videos

How can we load number of videos (video_count) from Tutorial Model with laravel 5.3's withCount() method

I have tried:

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

Edit

This works, Any Better solution?

Tutorial::withCount('chapters')
->with(['chapters' => function($query){
    $query->withCount('videos');
}])
->all();
4
  • Have you define relationship in models? Commented Sep 22, 2016 at 10:35
  • You only need to do one ->withCount('chapters.videos'). Also, make sure your relationships are set properly. Commented Sep 22, 2016 at 15:22
  • @DigitalFire Relationships are correct as i can load them with eager loading. just count doesn't populates with withCount() method Commented Sep 23, 2016 at 5:49
  • 1
    Please post your edit in answers section. I just prefer to do that. Commented Oct 8, 2017 at 9:04

1 Answer 1

66

You can only do a withCount() on a defined relation of the model.

However, a relationship can be hasManyThrough which would achieve what you are after.

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

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

And then you can do:

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

Docs:

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.