2017-07-25 37 views
0

我目前正在为我们的工作网站构建一个分析系统,我们有时间戳的应用程序数据库。Laravel Report Analytics - 缓慢的foreach查询循环

我试图得到每天与特定月份的应用程序的数量,我使用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); 

我传递两个网址参数的PHP代码$ qmonth和$ qyear,我运行取决于有多少天是在本月28日和31倍之间的查询,因为我需要每天统计应用程序的数量。有没有什么我可以做到这一点,而不必在循环中查询30次,因为我认为这就是为什么查询如此缓慢?

最好的问候, 加雷思

+0

30个查询单个请求的工作绝对是一个不少。你可以做的是** 1)**编写一个复杂的SQL查询,它返回你已经计算和分组的MySQL或**的所需结果** **从'应用程序\报告'的所有结果与一个查询和用PHP来转换它们以适应图表的抽象。 – TheFallen

+0

我将如何去做第二个选择? –

+0

为什么你不通过MYSQL获得结果,然后迭代db上的结果?当你在较低层次上工作时,速度会更快。 –

回答

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

注意,在$reports收集使用groupBy当你不得不返回报告当天。我不确定你使用的是什么格式,但如果是时间戳,你可以使用date函数格式化它以返回一天,如示例所示。

让我知道这运行得有多快。

编辑:

如果DATE_CREATED是碳的实例,从报道中收集groupBy方法返回$report->date_created->format('d');

+0

获取此错误日期()期望参数2为整数,对象给定 –

+0

@GarethJones在groupBy方法中用'return $ report-> date_created替换'date('d',$ report-> date_created)'调用 - >格式( 'd');'。这是因为你的* date_created *属性很可能是碳实例。 – TheFallen

+0

由于某种原因,计数返回零这里是一个输出[{“day”:1,“count”:0},{“day”:2,“count”:0},{“day”:3,“count “:0},{” 天 “:4”,计数 “:0},{” 天 “:5”,计数 “:0},{” 天 “:6,” 计数 “:0},{” 天“:7,” 计数 “:0},{” 天 “:8中,” 计数 “:0},{” 天 “:9”,计数 “:0},{” 天 “:10,” 计数“: 0},{ “天”: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, “计数”:0} .. 。 –