sql >> データベース >  >> RDS >> Mysql

Eloquentを使用したLaravelとマルチカウントクエリ

    モデルクラスで静的メソッドを呼び出すと、DB::table('yourmodeltable')->methodのようなFluentクエリが返されます。 。このことを念頭に置いておくと、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)の場合、奇妙に見えるかもしれないEloquentModelのインスタンスを返します。 。 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);
    }
    



    1. MySQLの問題:空のテーブルで左結合

    2. SQLServerインデックスの破損を修復するための無料の方法

    3. SQLの設計とクエリを試すためのオンラインツール

    4. チェックボックスでデータベースから複数の行を削除する