【问题标题】:Laravel eloquent models - filter by sumLaravel 雄辩模型 - 按总和过滤
【发布时间】:2018-09-16 14:30:24
【问题描述】:

我有两个模型:

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

佣金:id、user_id、金额、已付款、退款、created_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 中有一种更优雅的方式来做到这一点。

【问题讨论】:

  • $commissions = $user->commissions()->whereYear('created_at', $date->year)->whereMonth('created_at', $date->month)->where( 'paid', 'no')->where('refund', 'no')->sum('你的字段名');
  • 我知道 sum 方法,但是如何按范围过滤?
  • 其实查询的对象不只是一个用户,而是一般当月的佣金。
  • 然后你必须打印你的用户名,然后使用 foreach 循环
  • 请添加一些示例数据和预期结果。

标签: php laravel laravel-5 eloquent relationship


【解决方案1】:

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

$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();

【讨论】:

  • 最后,我能够通过 foreach 解决问题。无论如何,这是最有帮助的答案,谢谢。
【解决方案2】:

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]);

     });

【讨论】:

  • 佣金总和中不会搜索中间的
  • @Zoli 又轻松了 :)
猜你喜欢
  • 2021-08-11
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多