Laravel报告分析 - 缓慢的foreach查询循环

时间:2017-07-25 13:44:45

标签: php mysql ajax laravel-5

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

我试图获得每个特定月份的应用程序数量,我使用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次的情况下做到这一点,因为我认为这就是为什么查询这么慢?

祝你好运, 加雷思

2 个答案:

答案 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);