使用图表显示过去 12 个月的注册用户分析
Posted
技术标签:
【中文标题】使用图表显示过去 12 个月的注册用户分析【英文标题】:Show analytics of registered users for last 12 months using chart 【发布时间】:2020-03-04 20:24:55 【问题描述】:我正在尝试从数据库中获取过去 12 个月的所有用户,并使用图表显示一些统计数据。为此,我正在使用 chartJS。
$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 个月。如果一个月没有注册用户,则它必须也显示,但 计数为零。不幸的是,给定的查询目前不支持该功能,我该如何修改它?
【问题讨论】:
console.log(userRegisteredData);
的输出?
这是当前输出:prnt.sc/rbol0o
所以,对我来说,您需要获取结果数组并将其与预设数组碰撞,以检查缺少哪些月份并将其弹出到结果集中...您可以在返回控制器之前的模型。听起来合理吗?
听起来像是一个解决方案,但我想尝试一些更优雅的方式。
***.com/questions/27600863/…
【参考方案1】:
您需要在查询中进行如下更改:
$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 个月的所有日期
【讨论】:
它不起作用。你能提供更优雅的方法吗?【参考方案2】:比起雄辩,我更像是穴居人编码员,但我相信这会在不更改查询的情况下获得您正在寻找的结果集...在您的查询之后添加此内容以将新数据集发送到您的控制器。
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));
【讨论】:
以上是关于使用图表显示过去 12 个月的注册用户分析的主要内容,如果未能解决你的问题,请参考以下文章