Laravel фильтр «многие ко многим» с суммой - PullRequest
0 голосов
/ 28 февраля 2019

Я работаю в Laravel, и мне нужно отфильтровать пользователей, которые заказывают с определенной суммой денег в заказах, поэтому я использовал для фильтрации количество заказов

 User::where('type','client')
            ->has('orders', '>=', $min_orders)
            ->has('orders', '<=', $max_orders)
            ->withCount('orders')
        ->paginate(25)
        ;

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Если вы хотите SUM с информацией о пользователе, то вам нужно GROUP BY на информацию о пользователе.И если вы хотите СУММУ на столе многих сторон, то вы должны присоединиться к этой таблице.Предполагая, что у вас есть поле orders.amount, вы можете попробовать это:

<?php

User::select('user.id', 'email', 'name', 'type', \DB::raw('SUM(orders.amount) as amount_sum'))
    ->where('type','client')
    ->join('orders', 'orders.user_id', '=', 'user.id')
    ->has('orders', '>=', $min_orders)
    ->has('orders', '<=', $max_orders)
    ->withCount('orders')
    ->groupBy('user.id', 'email', 'name', 'type')
    ->havingRaw('amount_sum > ?', [50])
    ->orderBy('amount_sum', 'desc')
    ->paginate(25);

Таким образом, вы можете разбивать на страницы непосредственно в результаты одного запроса.Но помните, что каждый столбец User, который вы хотите использовать в SELECT, должен использоваться и в GROUP BY.

0 голосов
/ 28 февраля 2019

Попробуйте это

$users = User::filter(function ($user) use ($min_orders, $max_orders) {
    return ($user->orders()->sum('price') >= $min_orders) && ($user->orders()->sum('price') <= $max_orders);
})->get();

Не проверял, но я думаю, что это должно работать

...