deniamnet
@deniamnet
New Yorker, web developer

Laravel Eloquent: как сделать сортировку по сумме значений в отношении модели?

Всем привет, есть такие модели:

Vendor (id, title)
Service (id, vendor_id, type, price)


Отношение: Vendor hasMany Service
Нужно показать всех Vendor, отсортированных по сумме цены в Services, с определенным type
Например, имеем такие данные в таблице services:
1  |  1  |  development  |  10
2  |  2  |  development  |  20
3  |  1  |  testing  |  20
4  |  1  |  testing  |  15
5  |  1  |  other  |  15

Нужно выбрать всех вендоров, у которых услуги типа testing и development, и отсортировать их по сумме цены всех услуг данного вендора.
Как это сделать с помощью Eloquent?
  • Вопрос задан
  • 1030 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Faim
Можно так:
$vendors = Vendor::with(['services' => function($query) {
    $query->selectRaw('SUM(price) as sum, vendor_id, type')
    ->groupBy('vendor_id')
    ->groupBy('type')
    ->orderBy('sum', 'desc');
}])
->selectRaw('*, (SELECT SUM(price) FROM service WHERE service.vendor_id = vendor.id) as sum')
->orderBy('sum', 'desc')
->get();

При этом можно во вью получить такой результат:
@foreach($vendors as $vendor)
    <p><strong>{{ $vendor->title }} - сумма: {{ $vendor->sum }}</strong></p>
    @foreach($vendor->services as $service)
        <p>--- {{$service->type}}: {{ $service->sum }}</p>
    @endforeach
@endforeach

Vendor 1 - сумма: 3000
--- development: 2000
--- testing: 1000
Vendor 2 - сумма: 2600
--- development: 1800
--- testing: 800
Vendor 3 - сумма: 2200
--- development: 1600
--- testing: 600
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы