3

過去 7 日間の統計を生成するコードを最適化しようとしています。

現在、私は毎日記録されたデータに対して雄弁でクエリカウントを使用しています。これにより、ループ内で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;
}

here で説明されているのと同様の構文を使用して、SQL でクエリをグループ化できることを私は知っています。私が知りたいのは、Laravelで雄弁/流暢を使用して同じことができるかどうか、または生のクエリを使用してのみこれを行うことができるかどうかです?

編集:明確にする必要があるかどうかはわかりませんが、これは Laravel 3 の質問です。

4

1 に答える 1

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

編集:

上記の提案されたアプローチは、Eloquent Model のインスタンスを返します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);
}
于 2013-03-15T17:17:44.077 に答える