使用查询生成器 (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'); 

但是没用。

您可以只提取所需的所有信息,然后在需要时使用 sumavg,或者在查询后将其设置为变量以将其传递到您的视图.

例如:

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