按月份和类型用户分组收集

时间:2019-02-20 11:34:31

标签: laravel eloquent

我有一个发票集合,并据此制作一张图表,我想按月将它们分组,并在那几个月按用户类型细分。

如果我按月分组或按用户类型分组,则它们可以工作,但是如果我要按月分组,而按用户类型在该月分组,则行不通。

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;
}

2 个答案:

答案 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的用途,您需要的数据种类有点超出范围。