我有多个表的som结果,由
选择$places = Place::with(['rates' => function($query)
{
$query->select('id', 'place_id', 'criterion_id', 'value');
}])->select('id', 'coords')->get();
我需要通过sum(或avg)值来订购此reslut。我怎样才能做到这一点?我试着用
$query->select('id', 'place_id', 'criterion_id', 'value')->sum('value');
但它没有用。
答案 0 :(得分:1)
如果对你有用。您可以使用JOIN
代替预先加载。
代码将是这样的:
Place::leftJoin('rates', 'places.id', '=', 'rates.place_id')
->selectRaw('places.*, SUM(rates.value) as sumOfRateValues')
->groupBy('places.id')
->orderBy('sumOfRateValues', 'DESC')
->get();
答案 1 :(得分:0)
您可以提取所需的所有信息,然后在需要时使用sum
或avg
,或在查询后将其设置为变量以将其传递到视图中。< / p>
例如:
$places = Place::with(['rates' => function($query)
{
$query->select('id', 'place_id', 'criterion_id', 'value');
}])->select('id', 'coords')->get();
$sum = $places['rates']->sum('value');
$avg = $places['rates']->avg('value');
或者,如果您想在每个项目的视图中执行此操作:
@foreach ($places as $place)
{{ $place->rates->sum('value') }}
{{ $place->rates->avg('value') }}
@endforeach
答案 2 :(得分:0)
最简单(但不是最好)的解决方案是按照您的需要对集合进行排序,如下所示:
$places = Place::with([
'rates' => function ($query) {
$query->select('id', 'place_id', 'criterion_id', 'value');
}
])->select('id', 'coords')->get()->sortByDesc(function ($item) {
return $item->rates->sum('value'); //$item->rates->avg('value')
});
最佳解决方案是加入费率表并按sum(rates.value)
等汇总排序。