2013-03-15 27 views
3

我想优化我的代码,其中我在过去七天生成统计信息。Laravel和使用雄辩的多重计数查询

目前我正在使用口才&查询每天的记录数据的计数,这使我在一个循环内进行7个单独的查询。

例如:

// loop for number of days 
for($i = 0; $i < $days; $i++){ 
    // some logic to set comparitive unix times 
    $oldest = $newest - $dayDuration; 

    // count number of objects between oldest time and newest time 
    $counts[$i] = Object::where('objecttime','>',$oldest) 
          ->where('objecttime','<',$newest)->count(); 

    // more logic to set comparitive unix times 
    $newest = $newest - $dayDuration; 
} 

我知道在SQL一个罐组查询中使用类似的语法描述here;我想知道的是,如果能够在Laravel中使用雄辩/流利来做同样的事情,还是只能使用原始查询来做到这一点?

编辑:我不知道我是否需要澄清,但这是一个Laravel 3的问题。

回答

5

无论何时在您的模型类上调用静态方法,它都将返回一个Fluent查询,如DB::table('yourmodeltable')->method。如果你牢记这一点,你很快就会意识到可以用Eloquent模型进行任何查询。

现在,要实现更高的性能,可以使用SQL DATE()函数。我下面的例子未经测试,请随时纠正。

// tomorrow -1 week returns tomorrow's 00:00:00 minus 7 days 
// you may want to come up with your own date tho 
$date = new DateTime('tomorrow -1 week'); 

// DATE(objecttime) turns it into a 'YYYY-MM-DD' string 
// records are then grouped by that string 
$days = Object::where('objecttime', '>', $date) 
    ->group_by('date') 
    ->order_by('date', 'DESC') // or ASC 
    ->get(array(
     DB::raw('DATE(`objecttime`) AS `date`'), 
     DB::raw('COUNT(*) as `count`') 
    )); 

foreach ($days as $day) { 
    print($day->date . ' - '. $day->count); 
} 

这应该打印出类似这样:

2013-03-09 - 13 
2013-03-10 - 30 
2013-03-11 - 93 
2013-03-12 - 69 
2013-03-13 - 131 
2013-03-14 - 185 
2013-03-15 - 69 

编辑:

建议的方法上面洋洋洒洒模型的收益情况可能看起来怪异,特别是如果你var_dump($days)。您也可以使用Fluent的list()方法来实现同样的目的。

$date = new DateTime('tomorrow -1 week'); 

// lists() does not accept raw queries, 
// so you have to specify the SELECT clause 
$days = Object::select(array(
     DB::raw('DATE(`objecttime`) as `date`'), 
     DB::raw('COUNT(*) as `count`') 
    )) 
    ->where('created_at', '>', $date) 
    ->group_by('date') 
    ->order_by('date', 'DESC') // or ASC 
    ->lists('count', 'date'); 

// Notice lists returns an associative array with its second and 
// optional param as the key, and the first param as the value 
foreach ($days as $date => $count) { 
    print($date . ' - ' . $count); 
} 
+0

感谢您的回复,让我给一个bash并回报。 – twaambo 2013-03-15 18:19:05

+0

我用最后使用的查询更新了答案。再次感谢Vinícius。 – twaambo 2013-03-22 09:00:11

+0

group_by()和order_by()对我不起作用。我不得不使用groupBy()和orderBy()。 – 2014-10-03 15:11:24