Laravel 5的平均计数

时间:2015-07-07 13:34:56

标签: eloquent laravel-5

我们有两个类:模块资源,模块包含许多资源:

class Module extends Model {
    public function resources() {
        return $this->hasMany('App\Models\Resource');
    }
} 

和属于模块的资源:

class Resource extends Model {
    public function module() {
        return $this->belongsTo('App\Models\Module');
    }
}

我需要显示所有模块的列表:

  1. 每个模块的资源数量
  2. 每个模块的平均资源
  3. 第一个添加到Module模型中,因此可以与eager loading一起使用:

    public function resourcesCount() {
        return $this->hasMany('App\Models\Resource')
            ->selectRaw('module_id, count(*) AS aggregate')
            ->groupBy('module_id');
    }
    

    但是,我找不到一种有效而优雅的方法来计算resourcesCount计算的平均值。我知道我可以迭代结果

    $modules = Module::with('resourcesCount')->get(); 
    

    并手动完成,但我觉得那里有更好的东西。

    编辑:忘了说我修改了resourcesCountAttribute的访问者:

    public function getResourcesCountAttribute() {
        if (!$this->relationLoaded('resourcesCount')) 
            $this->load('resourcesCount');
    
        $related = $this->getRelation('resourcesCount');
        return ($related) ? (int) $related->aggregate : 0;
    }
    

    所以我可以使用'resourcesCount'(请参阅我的回复),而不必使用'resourcesCount.aggregate'。

2 个答案:

答案 0 :(得分:1)

我发现了一种可接受的方法,使用集合的方法。

// Returns an elloquent collection
$modules = Module::with('resourcesCount')->get(); 

// counts sums divided by the number of 
$avgResources = $modules->sum('resourcesCount') / $modules->count();

答案 1 :(得分:0)

唯一的方法是通过迭代或单独的DB :: select()语句来完成它,依赖于GROUP BY和AVERAGE()之类的东西。