使用查询构建器(laravel)通过desc求和

时间:2016-05-28 21:03:21

标签: mysql laravel query-builder

我有多个表的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'); 

但它没有用。

I have such table

3 个答案:

答案 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)

您可以提取所需的所有信息,然后在需要时使用sumavg,或在查询后将其设置为变量以将其传递到视图中。< / 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)等汇总排序。