Показать аналитику зарегистрированных пользователей за последние 12 месяцев, используя график - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь получить всех пользователей за последние 12 месяцев из базы данных и показать некоторую статистику с помощью диаграммы. Для этой цели я использую диаграмму JS.

$registeredUsersData = $connection->fetchAll(
    'SELECT
    COUNT(id) AS registered_users,
    CONCAT(MONTHNAME(created_on), " ", YEAR(created_on)) AS created_on
    FROM users 
    WHERE created_on 
    BETWEEN CURDATE() - INTERVAL 12 MONTH AND CURDATE() 
    GROUP BY YEAR(created_on), MONTH(created_on)
    ORDER BY YEAR(created_on) DESC, MONTH(created_on) DESC;
');

Мы передаем ее по symfony контроллер и рендер html шаблон.

$registeredUsersCount = array_column($registeredUsersData, 'registered_users');
$registeredUserMonths = array_column($registeredUsersData, 'created_on');

return $this->render('dashboard/admin/index.html.twig', [
    'registered_users_count' => $registeredUsersCount,
    'registered_users_months' => $registeredUserMonths
]);

В шаблоне я пытаюсь отобразить с помощью гистограммы, что данные, где год и месяц должны быть объединены, отображаются на абсциссе (X- по оси) и соответственно по ординате (ось Y).

<div class="chart-container">
    <canvas id="canvas"></canvas>
</div>

let months = {{ registered_users_months|json_encode|raw }};
let users = {{ registered_users_count|json_encode|raw }};
const ctx = document.getElementById('canvas').getContext('2d');
const myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: months,
        datasets: [{
            label: 'Registered Users Monthly',
            data: users,
            backgroundColor: 'rgba(90, 80, 191, 0.2)',
            borderColor: 'rgba(90, 80, 191, 1)',
            borderWidth: 1
        }]
    },
    options: {
        maintainAspectRatio: false,
        responsive: true,
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero: true
                },
            }]
        }
    }
});

Данные отображаются правильно, но отображаются не все"предыдущие" 12 месяцев. Если месяц не отображается у зарегистрированных пользователей это должно также отображаться , но с счетчиком нуля. К сожалению, данный запрос в настоящее время не поддерживает эту функцию, как я могу ее изменить?

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Я скорее программист-пещерный человек, чем красноречивый, но я считаю, что это позволяет получить набор результатов, который вы ищете, без изменения вашего запроса ... добавьте его после запроса, чтобы отправить новый набор данных на ваш контроллер.

for ($i = 1; $i < 12; $i++) {
    $monthToCheck[$i]['registered_users'] = 0;
    $monthToCheck[$i]['month_of_creation'] = date("F", strtotime( date( 'Y-m-01' )." -$i months"));
    $monthToCheck[$i]['year_of_creation'] = date("Y", strtotime( date( 'Y-m-01' )." -$i months"));
}

 return (array_merge($registeredUsersData,$monthToCheck));
1 голос
/ 05 марта 2020

Вам необходимо внести изменения в ваш запрос, как показано ниже:


$start = new DateTime(date('Y-m-d'));
$end = new DateTime(date('Y-m-d'));
$end->modify('+12 month');

$interval = DateInterval::createFromDateString('1 month');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    $registeredUsersData[$dt->format('Y-m')] = 0;
}

$registeredUsersData = $connection->fetchAll(
    'SELECT
    COUNT(id) AS registered_users,
    DATE_FORMAT(created_on,'%Y-%m') AS created_on
    FROM users 
    WHERE created_on BETWEEN CURDATE() - INTERVAL 12 MONTH AND CURDATE() 
    GROUP BY DATE_FORMAT(created_on,'%Y-%m')
    ORDER BY DATE_FORMAT(created_on,'%Y-%m') DESC;
');

foreach($registeredUsersData as $registeredUser) {
    $registeredUsersData[$registeredUser['created_on']] = $registeredUser['registered_users'];
}   

return $this->render('dashboard/admin/index.html.twig', [
    'registered_users_count' => array_values($registeredUsersData),
    'registered_users_months' => array_keys($registeredUsersData)
]);

Я также обновил ваш PHP, все даты на 12 месяцев

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