我有一个发票集合,并据此制作一张图表,我想按月将它们分组,并在那几个月按用户类型细分。
如果我按月分组或按用户类型分组,则它们可以工作,但是如果我要按月分组,而按用户类型在该月分组,则行不通。
Vue
const invoices = await this.$http.get('/invoices/stats', {
params: {
with: 'user,customer,extension',
start: this.startDate,
end: this.endDate,
}
})
Laravel
public function stats(Request $request)
{
$result = Invoice::with(explode(',', $request->with))
->scopes(['period'])
->get()
->groupBy(function ($q) {
return Carbon::parse($q->date)->format('m');
})
->groupBy('user.type');
return $result;
}
答案 0 :(得分:0)
这是我的解决方案:
// group by user types
$user_types = Invoice::with(explode(',', $request->with))
->scopes(['byMonth'])
->orderBy('date')
->get()
->groupBy('user.type');
// group the user types by month
// (double groupBy is not possible in 1 query)
foreach ($user_types as $key => $value) {
$user_types_by_month[$key] = $value->groupBy(function ($q) {
return Carbon::parse($q->date)->format('m');
});
}
// calculate the total by month by user types and replace the array with the total
foreach ($user_types_by_month as $i => $types) {
foreach ($types as $j => $months) {
$total = 0;
foreach ($months as $m) {
$total += $m->total;
}
$user_types_by_month[$i][$j] = $total;
}
}
return $user_types_by_month;
答案 1 :(得分:0)
据我所知,我认为您不能对一个集合进行多个groupby。只是做了一个快速测试,它对我不起作用。
我认为您有2种选择:
每月查询一次,将每个结果集合按用户类型分组,然后您将合并这些集合(基本上)。但您将进行更多查询。
如果只需要计数来显示图表,则可以在Eloquent外的SQL查询中使用多个group by来完成所有这些工作。 看起来像:
Select count(*), YEAR(i.date), MONTH(i.date), u.type
from invoice i left join user u on i.user_id = u.id
group by MONTH(i.date), YEAR(i.date), u.type
请记住,关于Eloquent的用途,您需要的数据种类有点超出范围。