Php Laravel报告分析-慢速foreach查询循环

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) {

我目前正在为我们的工作网站建立一个分析系统,我们有一个带有时间戳的应用程序数据库

我正试图在一个月内每天获取应用程序的数量,我正在使用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);
请注意,在
$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
查看是否有一些结果,它们数组的键是此代表的日期奥特是。