2017-10-05 11 views
1

Je suis en train de construire des graphiques statistiques analytiques pour un tableau de bord administrateur en utilisant Laravel. Je m'amuse beaucoup. Bien que j'ai un peu de difficulté à comprendre comment utiliser les requêtes SQL et la fonction GroupBy pour réaliser certaines choses.Count & GroupBy Fonction Laravel

objectif final: retreive le nombre de utilisateurs qui ont été créés et GroupBy la semaine ils ont enregistré.

Jusqu'à présent, je suis en utilisant ceci:

DB::table("users") 
    ->select(DB::raw("COUNT(*) as count")) 
    ->orderBy("created_at") 
    ->groupBy(function ($query) 
    { 
     return \Carbon\Carbon::parse($query->created_at)->format("W"); 
    }) 
    ->get(); 

Je reçois une erreur dans Tinker (qui est où je fais la majorité de mes tests au moment où il est quelque chose comme ceci:

PHP warning: strtolower() expects parameter 1 to be string, object given in 
/Users/Ian/sites/bangerz-army/vendor/laravel/framework/src/Illuminate/Database/Grammar.php on line 58 

j'avais obtenu une requête similaire à travailler en PHP, mais pour des raisons de performance je préfère garder autant de mathématiques dans SQL possible.

/Laravel 5.5

Répondre

0

Essayez d'utiliser DB::raw() dans votre groupe par

DB::table("users") 
    ->select(DB::raw("COUNT(*) as count, WEEK(created_at)")) 
    ->orderBy(DB::raw('WEEK(created_at)')) 
    ->groupBy(DB::raw('WEEK(created_at)')) 
    ->get(); 
+0

Ou utiliser 'orderByRaw' et' groupByRaw' :) – fubar

+1

Cela fonctionne parfaitement comme je stocke mes created_at's comme des instances de carbone selon Laravel par défaut. J'apprécie grandement l'aide! –

0

Effectuez les opérations suivantes:

DB::table('users') 
    ->select('WEEK(created_at, 1) AS week, COUNT(*) AS count') 
    ->groupBy('week') 
    ->orderBy('week', 'ASC') 
    ->get(); 

Notez l'option mode utilisée dans la WEEK fonction SQL. Cela indique quel jour de la semaine chaque nouvelle semaine commence. Je suis parti pour lundi dans mon exemple, mais vous pouvez trouver d'autres options