[英]Laravel eloquent models - filter by sum
我有兩個模型:
用戶: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 中有一種更優雅的方式來做到這一點。
簡單的另一個條件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]);
});
我不認為有一個簡單的解決方案:
$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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.