Сбор группы по месяцам и типу пользователя - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть коллекция счетов-фактур, и для составления графика из них я хочу сгруппировать их по месяцам, а в эти месяцы - по типу пользователя.

Если я группирую по месяцам или группирую попользовательский тип отдельно работает, но если я хочу сгруппировать их по месяцам, а в этом месяце по типу пользователя он не работает.

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 голосов
/ 20 февраля 2019

Из того, что я знаю, я не думаю, что вы можете сделать несколько групп в коллекции.Только что сделал быстрый тест, и он не работает на моей стороне.

Я думаю, у вас есть 2 варианта:

  • Делать запрос для каждого месяца, группировать каждый сбор результатовпо типу пользователя, то вы будете объединять коллекции (в основном).но вы будете делать больше запросов.

  • Если вам просто нужны счетчики для отображения диаграмм, вы можете делать все это с несколькими группами по запросу SQL вне Eloquent.Это выглядело бы следующим образом:

    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.

0 голосов
/ 20 февраля 2019

Это мое решение:

// 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...