Laravel фильтр "многие ко многим" с суммой
Я работаю в Laravel и мне нужно отфильтровать пользователей, которые заказывают с определенным количеством денег в заказах, поэтому я использовал для фильтрации количества заказов
User::where('type','client')
->has('orders', '>=', $min_orders)
->has('orders', '<=', $max_orders)
->withCount('orders')
->paginate(25)
;
2 ответа
Попробуй это
$users = User::filter(function ($user) use ($min_orders, $max_orders) {
return ($user->orders()->sum('price') >= $min_orders) && ($user->orders()->sum('price') <= $max_orders);
})->get();
Не проверял, но я думаю, что это должно работать
Если вы хотите 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.