2016-05-28 4 views
1

У меня есть сом результаты множественной таблицы, выбранныеСумма и порядок по алфавиту с построитель запросов (Laravel)

$places = Place::with(['rates' => function($query) 
    { 
     $query->select('id', 'place_id', 'criterion_id', 'value'); 

    }])->select('id', 'coords')->get(); 

мне нужно заказать эту reslut по сумме (или средний) значений. Как я могу это сделать? Я пытался использовать

$query->select('id', 'place_id', 'criterion_id', 'value')->sum('value'); 

но он не работает.

I have such table

+0

Пожалуйста, добавьте соответствующие таблицы базы данных и поля. Также сообщите нам пример ожидаемого результата. Благодаря! –

+0

@milz образец результата на снимке экрана – sqlnoob

+1

Отлично, что вы добавили результаты, но @milz означало, что вы должны показывать результаты, которые хотите, а не результаты, которые вы получаете. –

ответ

0

Если это работает с вами. Вы можете использовать JOIN вместо Eager Loading.

код будет выглядеть следующим образом:

Place::leftJoin('rates', 'places.id', '=', 'rates.place_id') 
      ->selectRaw('places.*, SUM(rates.value) as sumOfRateValues') 
      ->groupBy('places.id') 
      ->orderBy('sumOfRateValues', 'DESC') 
      ->get(); 
+0

Ты лучший! – sqlnoob

0

Вы можете просто вытащить всю информацию, что вам нужно, а затем использовать 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 
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).

Смежные вопросы