faisal
faisal

Reputation: 353

Returning counts of a relationship model in Laravel

I have a model for user and annotations along with a pivot table user_like for storing annotations liked by user. The annotation table is also associated with another model (ranges) through hasMany relationship. I am trying to return all annotations along with its user, ranges and total number of likes.

The code below works for user, ranges and even likes. But, I am only interested in returning the count of likes and not the actual values (i.e. list of users liking the annotation). Is there a way to include just the counts for one of the models from the relations?

Eloquent query:

    $annotations = Annotation::with('ranges')
                              ->with('likes')
                              ->with('author')
                              ->where('document_id', $docid)->get()->toArray();

The model:

class Annotation extends Eloquent {

    public function ranges()
    {
        return $this->hasMany('Range');
    }

    public function author()
    {
        return $this->belongsTo('User', 'user_id');
    }

    public function likes()
    {
        return $this->belongsToMany('User', 'annotation_like');
    }

    public function countOfLikes()
    {
        return $this->likes()->count();
    }

}

Upvotes: 1

Views: 1443

Answers (1)

Mysteryos
Mysteryos

Reputation: 5791

If you want to retrieve count for multiple annotations using eager loading then you need the following 'helper' relation setup:

public function countLikesRelation()
{
    return $this->belongsTo('User','annonation_like')->selectRaw('annotation_like, count(*) as count')->groupBy('annotation_like');
}

// then you can access it as such:

$annotations= Annotation::with('countLikesRelation')->get();
$annotations->first()->countLikesRelation->count;

// to make it easier, we create an accessor to the count attribute

public function getLikesCountAttribute()
{
    return $this->countLikesRelation->count;
}

//And then, simply use

$annotations->first()->sectionsCount;

Upvotes: 2

Related Questions