我目前正在为我们的工作网站构建分析系统,我们有一个带有时间戳的应用程序数据库。
我试图获得每个特定月份的应用程序数量,我使用ajax和图表js这样做,但是代码工作,php非常慢,我只是想知道是否还有改进这个。以下是我正在使用的代码:
$days = cal_days_in_month(CAL_GREGORIAN,$qmonth,$qyear);
foreach (range(1, $days) as $key => $number) {
$count = App\report::whereYear('date_created', $qyear)->whereMonth('date_created', $qmonth)->whereDay('date_created', $number)->count();
$cart[] = array('day' => $number, 'count' => $count);
}
$result = json_encode($cart);
print_r($count);
我将两个url参数传递给php代码$ qmonth和$ qyear,我在28到31次之间运行查询,具体取决于当月的天数,因为我需要计算每天的应用程序数量基础。有没有我能在不循环查询30次的情况下做到这一点,因为我认为这就是为什么查询这么慢?
祝你好运, 加雷思
答案 0 :(得分:0)
这就是你如何对所有结果进行PHP转换:
$cart = [];
$days = cal_days_in_month(CAL_GREGORIAN, $qmonth, $qyear);
$reports = App\report::whereYear('date_created', $qyear)->whereMonth('date_created', $qmonth)->get();
$reports = $reports->groupBy(function ($report) {
return date('d', $report->date_created);
})->toArray();
foreach (range(1, $days) as $day) {
$count = isset($reports[$day]) ? count($reports[$day]) : 0;
$cart[] = ['day' => $day, 'count' => $count];
}
$result = json_encode($cart);
print_r($count);
请注意,在groupBy
集合中使用$reports
时,您必须返回报告日期。我不确定您使用的是哪种格式,但如果是时间戳,您可以使用date
函数对其进行格式化以返回当天,如示例所示。
让我知道这有多快。
修改强>
如果 date_created 是碳实例,请从报告集合$report->date_created->format('d');
方法返回groupBy
。
答案 1 :(得分:0)
我设法使用此代码
让它工作 $cart = [];
$days = cal_days_in_month(CAL_GREGORIAN, $qmonth, $qyear);
$reports = App\report::whereYear('date_created', $qyear)->whereMonth('date_created', $qmonth)->select('date_created')->get();
if ($reports->count()) {
}else{
$items = array();
}
foreach($reports as $i){
$items[] = $i['date_created']->format('j');
}
$countarray = array_count_values($items);
foreach (range(1, $days) as $day) {
$count = isset($countarray[$day]) ? $countarray[$day] : 0;
$cart[] = ['day' => $day, 'count' => $count];
}
$result = json_encode($cart);
print_r($result);