Заполните пропущенные даты в Laravel Красноречивый запрос - PullRequest
0 голосов
/ 28 января 2020

У меня есть запрос, который извлекает мои данные из таблицы на основе столбца created_at. Я пытаюсь заполнить пропущенные месяцы за год. Так, например, у меня есть данные за февраль, но это так. Как я могу заполнить сумму 0 за январь, а затем за март-декабрь?

Мой запрос на вывод, основанный на полном названии месяца, выглядит следующим образом:

$servers = Stat::where('type','servers')->orderBy('created_at', 'asc')->whereYear('created_at', '=', date("Y"))
            ->select(DB::raw("SUM(amount) as total"))
            ->get()
            ->groupBy(function($val) {
            return Carbon::parse($val->created_at)->format('F');
    });

В этом случае я получить мой февраль и общую сумму. Мне бы хотелось, чтобы остальные несуществующие суммы были равны 0, или введите правильную информацию, если она существует позднее в этом году.

1 Ответ

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

Вы используете sum() в течение всего года и используете метод groupBy для сбора, таким образом, есть только один месяц.

Вам нужно сгруппировать по месяцам, как это:

$servers = Stat::where('type','servers')
               ->orderBy('created_at', 'asc')
               ->whereYear('created_at', '=', date("Y"))
               ->groupBy(DB::raw("MONTH(created_at)"))
               ->selectRaw("SUM(amount) as total, create_at")
               ->get()
               ->groupBy(function($val) {
                   return $val->created_at->format('F');
               });

и вы можете использовать CarbonPeriod для создания начального массива месяца, а затем объединить с servers:

$all_month = array();
$period = \Carbon\CarbonPeriod::create('2020-01-01', '1 month', '2021-12-31');
foreach ($period as $p) {
    $m = $p->format('F');
    if (isset($servers[$m])) {
       $all_month []= [$m => $servers[$m]->first()->total];
    } else {
       $all_month []= [$m => 0];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...