Laravel多对多过滤器总和

时间:2019-02-28 17:23:17

标签: php laravel laravel-queue

我在laravel工作,我需要过滤订单中有一定金额的用户 所以我过去常常过滤订单数

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

2 个答案:

答案 0 :(得分:1)

尝试这个

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

尚未测试,但我认为它应该可以工作

答案 1 :(得分:0)

如果您想对用户信息进行求和,则需要对用户信息进行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);

这样,您可以直接分页到一个查询结果中。但是请记住,要在SELECT中使用的每个User列也必须在GROUP BY中使用。