Laravel 带总和的多对多过滤器
Laravel Many to Many filter with sum
我在laravel工作,需要过滤订单中有一定金额下单的用户
所以我用来过滤订单数量
User::where('type','client')
->has('orders', '>=', $min_orders)
->has('orders', '<=', $max_orders)
->withCount('orders')
->paginate(25)
;
试试这个
$users = User::filter(function ($user) use ($min_orders, $max_orders) {
return ($user->orders()->sum('price') >= $min_orders) && ($user->orders()->sum('price') <= $max_orders);
})->get();
还没有测试过,但我觉得应该可以
如果您希望对用户信息求和,则需要对用户信息进行 GROUP BY。如果你想要多边的 SUM table,那么你必须 JOIN 到那个 table。假设你有 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);
这样你就可以直接分页到单个查询结果中。但请记住,您要在 SELECT 中使用的每个用户列也必须在 GROUP BY 中使用。
我在laravel工作,需要过滤订单中有一定金额下单的用户 所以我用来过滤订单数量
User::where('type','client')
->has('orders', '>=', $min_orders)
->has('orders', '<=', $max_orders)
->withCount('orders')
->paginate(25)
;
试试这个
$users = User::filter(function ($user) use ($min_orders, $max_orders) {
return ($user->orders()->sum('price') >= $min_orders) && ($user->orders()->sum('price') <= $max_orders);
})->get();
还没有测试过,但我觉得应该可以
如果您希望对用户信息求和,则需要对用户信息进行 GROUP BY。如果你想要多边的 SUM table,那么你必须 JOIN 到那个 table。假设你有 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);
这样你就可以直接分页到单个查询结果中。但请记住,您要在 SELECT 中使用的每个用户列也必须在 GROUP BY 中使用。