Laravel: получить просмотры страниц за последние 30 дней - PullRequest
0 голосов
/ 05 мая 2020

Мне нужен вывод, в котором перечислены просмотры страниц за последние 30 дней.

Это моя структура.

CREATE TABLE `view_history` (
  `page_id` int(11) NOT NULL,
  `date` date NOT NULL,
  `views` int(6) DEFAULT '0',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`page_id`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Контроллер:

$pageViews = ViewHistory::where('page_id',1)
                ->select('date','views')
                ->orderBy('date','DESC')
                ->take(30)
                ->get();

Blade:

@foreach($pageViews as $pageView)
    date: {{$pageView->date}}
    views: {{$pageView->views}}<br>
@endforeach

Вывод в браузер:

date: 2020-05-02 views:10
date: 2020-04-30 views:7
date: 2020-04-26 views:2
date: 2020-04-23 views:12
date: 2020-04-22 views:12
date: 2020-04-21 views:12
date: 2020-04-16 views:6
date: 2020-04-14 views:11
date: 2020-04-12 views:11
date: 2020-04-11 views:1
date: 2020-04-09 views:7
date: 2020-04-07 views:12
date: 2020-04-06 views:6
date: 2020-04-05 views:10
date: 2020-04-04 views:3
date: 2020-04-03 views:6

Когда я копаюсь в базе данных, я обнаружил, что для какой-то даты вообще нет записи. (Предположим, 0 просмотров). Как go я получаю все 0 просмотров в день на выходе?

Спасибо!

Ответы [ 3 ]

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

Вы можете использовать дни каждого месяца вместо записей

<?php
$period = Carbon::period(now()->startOfMonth(), now()->endOfMonth());
$pageViews = ViewHistory::where('page_id',1)
                ->select('date','views')
                ->orderBy('date','DESC')
                ->take(30)
                ->get();
// we are foreaching all month days instead of only that you have in database
foreach($period as $date){
    $existing = $pageViews->where('date', $date->format('Y-m-d'));
    $views = $existing ? $existing->views : 0;
    echo sprintf('date: %s views: %d', $date->format('Y-m-d'), $views);
}
0 голосов
/ 05 мая 2020

Вы можете использовать функцию карты:

сгенерировать помощник с датами для каждого дня:

$start_month_helper = clone $date_start;
    while ($start_month_helper ->lte($date_end)) {
        $days[] = $start_month_helper ->copy()->format('Y-m-d');
        $start_month_helper->addDay();
    }

После этого вы можете просто сопоставить после вашего запроса - если есть подходящий день добавьте представления, иначе 0:

$data = collect();

ViewHistory::where('page_id',1)
            ->select('date','views')
            ->orderBy('date','DESC')
            ->take(30)
            ->get()
        ->map(function ($item) use($data)  {
            foreach($months as $key => $month) {
                if ($item['date'] === $month) {
                    unset($months[$key]);
                    $data->push($item['views']);
                    return;
                }
                $data->push(0);
                unset($months[$key]);
            }
            return;
        });

Теперь у вас есть данные в $ data.

0 голосов
/ 05 мая 2020

Вы можете сделать что-то вроде этого

$now = now();
$pageViews = ViewHistory::where('page_id', 1)
    ->select('date', 'views')
    ->whereBetween('date', [$now->toDateString(), $now->copy()->subDays(30)->toDateString()])
    ->get();

$formattedViews = collect();

for ($i = 0; $i <= 30; $i++) {
    $date = $now->subDay($i)->toDateString();
    $pageView = $pageViews->where('date', $date)->first();
    $formattedViews->add([
        'date' => $date,
        'views' => $pageView ? $pageView->views : 0
    ]);
}

, а затем передать $formattedViews в свой файл лезвия

...