使用查询生成器 (laravel) 按 desc 求和和排序
Sum and order by desc with query builder (laravel)
我有多个 table 的结果,由
选择
$places = Place::with(['rates' => function($query)
{
$query->select('id', 'place_id', 'criterion_id', 'value');
}])->select('id', 'coords')->get();
我需要按值的总和(或平均值)对结果进行排序。我怎样才能做到这一点?我尝试使用
$query->select('id', 'place_id', 'criterion_id', 'value')->sum('value');
但是没用。
您可以只提取所需的所有信息,然后在需要时使用 sum
或 avg
,或者在查询后将其设置为变量以将其传递到您的视图.
例如:
$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
最简单(但不是最好)的解决方案是根据需要对集合进行排序,如下所示:
$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')
});
最好的解决方案是加入费率 table 并按聚合排序,例如 sum(rates.value)
。
如果对你有用。您可以使用 JOIN
而不是预加载。
代码将是这样的:
Place::leftJoin('rates', 'places.id', '=', 'rates.place_id')
->selectRaw('places.*, SUM(rates.value) as sumOfRateValues')
->groupBy('places.id')
->orderBy('sumOfRateValues', 'DESC')
->get();
我有多个 table 的结果,由
选择$places = Place::with(['rates' => function($query)
{
$query->select('id', 'place_id', 'criterion_id', 'value');
}])->select('id', 'coords')->get();
我需要按值的总和(或平均值)对结果进行排序。我怎样才能做到这一点?我尝试使用
$query->select('id', 'place_id', 'criterion_id', 'value')->sum('value');
但是没用。
您可以只提取所需的所有信息,然后在需要时使用 sum
或 avg
,或者在查询后将其设置为变量以将其传递到您的视图.
例如:
$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
最简单(但不是最好)的解决方案是根据需要对集合进行排序,如下所示:
$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')
});
最好的解决方案是加入费率 table 并按聚合排序,例如 sum(rates.value)
。
如果对你有用。您可以使用 JOIN
而不是预加载。
代码将是这样的:
Place::leftJoin('rates', 'places.id', '=', 'rates.place_id')
->selectRaw('places.*, SUM(rates.value) as sumOfRateValues')
->groupBy('places.id')
->orderBy('sumOfRateValues', 'DESC')
->get();