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

我正在尝试获取特定月份每天的应用程序数量,我使用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/

10-12 12:51
查看更多