Php Laravel报告分析-慢速foreach查询循环
我目前正在为我们的工作网站建立一个分析系统,我们有一个带有时间戳的应用程序数据库 我正试图在一个月内每天获取应用程序的数量,我正在使用ajax和chart js来实现这一点,但是代码工作正常,php速度非常慢,我只是想知道是否有任何方法可以改进这一点。下面是我正在使用的代码:Php Laravel报告分析-慢速foreach查询循环,php,mysql,ajax,laravel-5,Php,Mysql,Ajax,Laravel 5,我目前正在为我们的工作网站建立一个分析系统,我们有一个带有时间戳的应用程序数据库 我正试图在一个月内每天获取应用程序的数量,我正在使用ajax和chart js来实现这一点,但是代码工作正常,php速度非常慢,我只是想知道是否有任何方法可以改进这一点。下面是我正在使用的代码: $days = cal_days_in_month(CAL_GREGORIAN,$qmonth,$qyear); foreach (range(1, $days) as $key => $number) {
$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);
请注意,在$reports
集合上使用groupBy
时,必须返回报告的日期。我不确定您使用的是什么格式,但如果是时间戳,您可以使用date
函数对其进行格式化以返回日期,如示例所示
让我知道它跑得有多快
编辑:
如果创建的日期是碳实例,则返回
$report->date\u created->format('d')代码>来自报告集合groupBy
方法。我设法使用此代码使其工作
$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);
一个请求30个查询肯定是很多的。您可以做的是1)编写一个复杂的SQL查询,返回您所需的结果,该结果已由MySQL计算并分组;或2)使用单个查询从App\report
获取所有结果,并使用PHP将其转换为符合chartjs Exotects的结果。我将如何执行第二个选项?您为什么不通过MySQL和然后在db上迭代结果?在较低的层上工作时速度要快得多。获取此错误日期()要求参数2为整数,即objectgiven@GarethJones在groupBy
方法中,将date('d',$report->date\u created)
调用替换为return$report->date\u created->format('d')代码>。这是因为最有可能您的date_创建的属性是carbon实例。由于某种原因,计数返回零这里是一个输出[{“day”:1,“count”:0},{“day”:2,“count”:0},{“day”:3,“count”:0},{“day”:4,“count”:0},{“day”:5,“count”:0},{“day”:6,“count”:0},{“day”:7,“count”:0},{“day”:8,“count”:0},{“day”:9,“count”:0},{“day”:10,“count”:0},{“day”:11}:0,{“天”:12,“计数”:0,{“天”:13,“计数”:0,{“天”:14,“计数”:0,{“天”:15,“计数”:0,{“天”:16,“计数”:0,{“天”:17,“计数”:0,{“天”:18,“计数”:0,{“天”:19,“计数”:0,{“天”:20,“计数”:0,{“天”:21,“计数”:0,{“天”:22,“计数”:0,{“天”:23,“计数”:0,{“天”:24,{…在格式化日期\u创建的$report->日期\u创建的->格式('d')后返回$reports时;日期的格式似乎不正确,因为在数组中,日期仍然是以下格式-2017-07-01 07:40:46@GarethJones这只是按天对报告进行分组,而不是格式化输出日期。请尝试使用var_dump$reports
查看是否有一些结果,它们数组的键是此代表的日期奥特是。