返回Laravel中关系模型的计数

时间:2014-09-12 08:26:41

标签: laravel laravel-4 eloquent

我有一个用户和注释模型以及一个数据透视表user_like,用于存储用户喜欢的注释。注释表还通过hasMany关系与另一个模型(范围)相关联。我试图返回所有注释及其用户,范围和喜欢的总数。

以下代码适用于用户,范围甚至喜欢。但是,我只对返回喜欢的数量而不是实际值(即喜欢注释的用户列表)感兴趣。有没有办法只包括关系中其中一个模型的计数?

雄辩查询:

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

模特:

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();
    }

}

2 个答案:

答案 0 :(得分:2)

如果您想使用预先加载来检索多个注释的计数,那么您需要以下帮助'关系设置:

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;

答案 1 :(得分:-2)

为什么不创建范围?

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

然后

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