我目前正在为我们的工作现场建立一个分析系统,我们有一个带有时间戳的应用程序数据库。
我正在尝试获取特定月份每天的应用程序数量,我使用ajax和chart 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次,因为我认为这就是为什么查询如此缓慢的原因?
最好的祝福,
加雷斯
最佳答案
这就是您要对所有结果进行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是Carbon实例,请从报告集合
$report->date_created->format('d');
方法返回groupBy
。关于php - Laravel Report Analytics-慢的foreach查询循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45305222/