laravel collection groupBy () / включает пустые результаты - PullRequest
0 голосов
/ 25 января 2020

Для API диаграммы мне нужно указать количество зарегистрированных пользователей в день.

//fetch all created_at dates of users from the last week
$signUpsLastWeek = User::whereDate('created_at', '>=', now()->subDays(7))->select('created_at')->get();

//group them now by date now, using collection operations
dd($signUpsLastWeek->groupBy(function($item) {
    return $item->created_at->format('m.d');
}));

//now manipulate the collection a bit, so we get the date with the amount of new registered users
$signUpsLastWeek->mapWithKeys(function ($userGroup, $key) {
    return [$key => $userGroup->count()];
})

Возвраты:

Illuminate\Database\Eloquent\Collection {#774 ▼
  #items: array:1 [▼
    "01.19" => 4
  ]
}

Это отлично работает, вопрос оставлен.

В приведенном выше примере кода в остальные дни зарегистрировано 0 новых регистраций, что означает, что коллекция должна выглядеть примерно так:

Illuminate\Database\Eloquent\Collection {#774 ▼
  #items: array:1 [▼
    "01.25" => 0,
    "01.24" => 0,
    "01.23" => 0,
    "01.22" => 0,
    "01.20" => 0,
    "01.19" => 4,
    ...,
  ]
}

Есть идеи, как включить также 0 значений?

1 Ответ

0 голосов
/ 25 января 2020

Я думаю, вы можете использовать CarbonPeriod для создания календаря и установить счетчик по умолчанию 0 для каждой даты.

А затем сбросить значение из подсчета ваших пользователей:

$start_date = explode(' ', User::whereDate('created_at', '>=', now()->subDays(7))->min('created_at'))[0];
$end_date = \Carbon\Carbon::now()->format('Y-m-d');
$period = \Carbon\CarbonPeriod::create($start_date, $end_date);

$all_dates = [];
foreach ($period as $date) {
    $all_dates = array_merge($all_dates, [$date->format('m.d') => 0]);
}
$all_dates = array_reverse($all_dates);

collect($all_dates)->mapWithKeys(function($v, $date) use ($signUpsLastWeek) {
                    if (in_array($date, array_keys($signUpsLastWeek))) {
                        return [$date => $signUpsLastWeek[$date]->count()];
                    } else {
                        return [$date => 0];
                    }
                })->all();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...