Search code examples
laravelcounteloquenthas-manyrelationships

Laravel Eloquent model with counter


I'm trying to count all the files within a category, and I have these two relationships:

public function files() { return $this->hasMany('App\File', 'category_id','category_id'); } public function fileCount() { return $this->files()->selectRaw("category_id, count(*) AS count") ->groupBy('category_id'); }

This gives me a collection of items, where the count attribute could be accessed like this: $my_category = Category::where("category_id", category_id)->with('fileCount')->get(); $file_counter = $my_category->first()->fileCount->first()->count;

Is it possible to directly attach the count attribute to the $my_category variable? Any suggestions will be appreciated.


Solution

  • You can use withCount() method:

    $my_category = Category::where("category_id", category_id)
                           ->withCount(['files' => function($q) {
                               $q->groupBy('category_id');
                           })
                           ->get();
    

    This will put files_count attribute into results.

    If you want to count the number of results from a relationship without actually loading them you may use the withCount method, which will place a {relation}_count column on your resulting models