Laravel: Сумма за день (группировка по дате), затем сохранить дату с пустыми строками - PullRequest
0 голосов
/ 05 мая 2020

stackoverflow,

У меня работает laravel функция, которая получает ежедневную сумму продаж за последние 30 дней. Я буду использовать данные для построения графика, поэтому мне нужно получить даты, даже если он пуст, и дать им значение «0» в качестве их суммы.

вот мой код (он работает, но возвращает только даты которые не пустые)

public function getDaily() {
    $startDate = Carbon::now()->subDays(30);
    $endDate = Carbon::now();
    $all_dates = array();

   for($i = 0;$i<=30;$i++)
   {
        $all_dates[] = $startDate->toDateString();
        $startDate->addDay();
        $sales=DB::table('sale_details')
        ->select(DB::raw('sum(amount_due) as daily'),DB::raw('date(created_at) as date'))
        ->groupBy('date')
        ->orderBy('date','desc')
       ->get();
   }
    return $sales;
}

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Для получения массива объектов вы можете использовать хорошие методы Collection:

$sales = DB::table('sale_details')
    ->whereBetween('created_at', [$startDate, $endDate])
    ->select([
        DB::raw('sum(amount_due) as daily'),
        DB::raw('date(created_at) as date'),
    ])
    ->groupBy('date')
    ->get()
    ->keyBy('date');

$period = new CarbonPeriod($startDate, '1 day', $endDate);

// Fill zeroes
foreach ($period as $date) {
    $dateString = $date->toDateString();

    if (!$sales->has($dateString)) {
        $sales->put($dateString, ['date' => $dateString, 'daily' => 0]);
    }
}

// Convert to associative array
$sales = $sales->values()->toArray();
1 голос
/ 05 мая 2020

Попробуйте следующее:

$sales = DB::table('sale_details')
    ->whereBetween('created_at', [$startDate, $endDate])
    ->select([
        DB::raw('sum(amount_due) as daily'),
        DB::raw('date(created_at) as date'),
    ])
    ->groupBy('date')
    ->orderBy('date','desc')
    ->pluck('daily', 'date')
    ->toArray();

$period = new CarbonPeriod($startDate, '1 day', $endDate);

// Fill zeroes
foreach ($period as $date) {
    if (!isset($sales[$date->toDateString()])) {
        $sales[$date->toDateString()] = 0;
    }
}

Другое решение - использование серий дат, созданных базой данных (pg sql пример: Создание временных рядов между двумя датами в PostgreSQL) и присоединить его к результату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...