我们有两个类:模块和资源,模块包含许多资源:
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');
}
}
我需要显示所有模块的列表:
第一个添加到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'。
答案 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()之类的东西。