代码之家  ›  专栏  ›  技术社区  ›  Zoli

Laravel雄辩模型-按和过滤

  •  0
  • Zoli  · 技术社区  · 7 年前

    我有两种型号:

    用户:id、姓名、电子邮件

    佣金:id,user\u id,金额,已付,退款,created\u at

    关系:用户有多个佣金

    我需要计算每个用户每月的佣金总额,并将其下载到CSV文件中进行批量支付,但这些总额必须大于25,小于25000。

    目前我拥有的是这些,但如何根据金额范围进行筛选?我需要将那些已经支付的佣金标记为已支付,但只会支付那些大于25但小于25000的佣金

    $commissions = Commissions::whereYear('created_at', $date->year)
    ->whereMonth('created_at', $date->month)
    ->where('paid', 'no')
    ->where('refund', 'no')
    ->get();
    

    我可以通过计算foreach中的数量进行过滤,但我几乎可以肯定,在Laravel中有一种更优雅的方法可以做到这一点。

    2 回复  |  直到 4 年前
        1
  •  1
  •   Jonas Staudenmeir    7 年前

    我认为没有一个简单的解决方案:

    $commissions = Commission::whereYear('created_at', $date->year)
        ->whereMonth('created_at', $date->month)
        ->where('paid', 'no')
        ->where('refund', 'no')
        ->where('amount', '<', 25000)
        ->orderByDesc('amount')
        ->get();
    $grouped = $commissions->groupBy('user_id');
    $grouped = $grouped->filter(function($commissions) {
        return $commissions->sum('amount') > 25;
    });
    $grouped = $grouped->map(function($commissions) {
        $sum = 0;
        return $commissions->filter(function($commission) use(&$sum) {
            $sum += $commission->amount;
            return $sum < 25000;
        });
    });
    $commissions = $grouped->collapse();
    
        2
  •  1
  •   Leo    7 年前

    简单只是另一个条件 whereBetween

    $commissions = $user->commissions()
        ->whereYear('created_at', $date->year)
        ->whereMonth('created_at', $date->month)
        ->where([['paid' , 'no'], ['refund', 'no']])
        ->whereBetween('price', [25, 25000])
        ->sum('price');
    

    或:

    $commissions = $user->commissions()
        ->whereYear('created_at', $date->year)
        ->whereMonth('created_at', $date->month)
        ->where([['paid' , 'no'], ['refund', 'no']])
        ->sum('price')->filter(function($value, $key){
    
            return in_array($value, [25,25000]);
    
         });