Как получить последние 7 дней записи с 0 счетами - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть красноречивый запрос, который получает общее количество записей (созданных_ат) за последние 7 дней. Но проблема в том, что если на днях было 0 записей, это не отражается в окончательных данных.

Мой запрос:

$data = Data::whereBetween('created_at', [Carbon::now()->subDays(6)->format('Y-m-d')." 00:00:00", Carbon::now()->format('Y-m-d')." 23:59:59"])
             ->groupBy('date')
             ->orderBy('date')
             ->get([
                 DB::raw('DATE(created_at) as date'),
                 DB::raw('count(*) as total')
             ])
             ->pluck('total', 'date')->toArray();

Что я получу:

[    
    "2020-04-14" => 1
    "2020-04-16" => 1
    "2020-04-18" => 1
    "2020-04-19" => 1
]

Что я ожидал:

[    
    "2020-04-14" => 1    
    "2020-04-15" => 0
    "2020-04-16" => 1    
    "2020-04-17" => 0
    "2020-04-18" => 1
    "2020-04-19" => 1    
    "2020-04-20" => 0
]

Есть какие-нибудь предложения?

РЕШЕНИЕ:

- на основе предложения Гэри Хоубра:

$results = Data::whereBetween('created_at', [Carbon::now()->subDays(6)->format('Y-m-d')." 00:00:00", Carbon::now()->format('Y-m-d')." 23:59:59"])
    ->groupBy('date')
    ->orderBy('date')
    ->get([
        DB::raw('DATE_FORMAT(created_at, "%Y-%m-%d") as date'),
        DB::raw('count(*) as total')
    ])
    ->keyBy('date')
    ->map(function ($item) {
        $item->date = Carbon::parse($item->date);
        return $item;
    });

$period = new DatePeriod(Carbon::now()->subDays(6), CarbonInterval::day(), Carbon::now()->addDay());

$graph = array_map(function ($datePeriod) use ($results) {
    $date = $datePeriod->format('Y-m-d');
    return $results->has($date) ? $results->get($date)->total : 0;

}, iterator_to_array($period));

Ответы [ 3 ]

1 голос
/ 20 апреля 2020

Моя идея - создать for l oop для проверки дней.

Если в дате нет записи, выведите 0

L oop Итерация:

  • Поймать первый день (предположим, 14)
  • Поймать последний день
  • Затем проверять в каждой итерации, что он больше, чем один или много

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

1 голос
/ 20 апреля 2020

У нас была похожая проблема, когда мы пытались поместить фоновые данные в график. Так как некоторые дни отсутствовали, это не выглядело хорошо. Наше решение было:

Создайте функцию, подобную этой;

public function generateDates(Date $startDate, Date $endDate, $format = 'Y/m/d'): Collection
{
    $dates = collect();
    $startDate = $startDate->copy();

    for ($date = $startDate; $date->lte($endDate); $date->addDay()) {
        $dates->put($date->format($format), 0);
    }

    return $dates;
}

В вашем случае это будет (сегодня и сегодня - шесть дней), и вы будете union возвращать коллекцию вместе с вашим сбор запросов. Что это делает? он создает диапазон дат из ключей и заполняет их нулями. Когда ваша коллекция запросов имеет какое-либо значение, отличное от нуля, она будет перезаписана.

1 голос
/ 20 апреля 2020

Взгляд прямо Sql: Как включить "ноль" / "0" в агрегат COUNT?

В ту же таблицу: Как получить запись, если Счетчик равен нулю в Laravel

Вам необходимо добавить внешнее объединение в ваш запрос с помощью Eloquent.

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