Laravel Eloquent groupBy () AND renvoie également le nombre de chaque groupe

110

J'ai un tableau qui contient, entre autres colonnes, une colonne des versions de navigateur. Et je veux simplement savoir à partir du jeu d'enregistrements, combien il y a de chaque type de navigateur. Donc, je dois me retrouver avec quelque chose comme ceci: Total Records: 10; Internet Explorer 8: 2; Chrome 25: 4; Firefox 20: 4. (tout en ajoutant jusqu'à 10)

Voici mes deux pence:

$user_info = Usermeta::groupBy('browser')->get();

Bien sûr, cela ne contient que les 3 navigateurs et non le nombre de chacun. Comment puis-je faire ceci?

kJamesy
la source

Réponses:

217

Cela fonctionne pour moi:

$user_info = DB::table('usermetas')
                 ->select('browser', DB::raw('count(*) as total'))
                 ->groupBy('browser')
                 ->get();
Antonio Carlos Ribeiro
la source
1
Superbe! Juste ajouté 'browser' à la sélection ainsi: select ('browser', ...) et obtenu tout le nécessaire. Tu es bon, toi! youtube.com/watch?v=ravi4YtUTxo
kJamesy
Merci. Mais pourquoi ne fonctionne-t-il pas lorsqu'il est utilisé avec des modèles comme User :: select ('country', DB :: raw ('count (*) as total') -> otherMethods ()?
doncadavona
1
+ v. utiliser \ DB au lieu de DB sur les contrôleurs
Amit Bera
@AmitBera pouvez-vous expliquer la raison?,
S'il
8
Y at - il une raison particulière que vous préférez DB::table('usermetas')->..plus Usermeta::..?
Adam
34

Cela fonctionne pour moi (Laravel 5.1):

$user_info = Usermeta::groupBy('browser')->select('browser', DB::raw('count(*) as total'))->get();
carlituxman
la source
22

Merci Antonio,

Je viens d'ajouter la listscommande à la fin afin qu'elle ne renvoie qu'un seul tableau avec la clé et le nombre:

Laravel 4

$user_info = DB::table('usermetas')
             ->select('browser', DB::raw('count(*) as total'))
             ->groupBy('browser')
             ->lists('total','browser');

Laravel 5.1

$user_info = DB::table('usermetas')
             ->select('browser', DB::raw('count(*) as total'))
             ->groupBy('browser')
             ->lists('total','browser')->all();

Laravel 5.2+

$user_info = DB::table('usermetas')
             ->select('browser', DB::raw('count(*) as total'))
             ->groupBy('browser')
             ->pluck('total','browser')->all();
Diogo Gomes
la source
1
Merci. Une remarque: -> all () dans l'exemple 5.1 doit être supprimé, puisque vous listez déjà les résultats.
Pim
1
list()est obsolète et renommé pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0
Arun Code
13

Si vous voulez obtenir collection, groupBy et count:

$collection = ModelName::groupBy('group_id')
->selectRaw('count(*) as total, group_id')
->get();

À votre santé!

Adam Kozlowski
la source
9

Fonctionne de cette façon aussi, un peu plus ordonné. getQuery()renvoie simplement le générateur sous-jacent, qui contient déjà la référence de table.

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
                     ->select('browser', $browser_total_raw)
                     ->groupBy('browser')
                     ->pluck('total','browser');
Yauheni Prakopchyk
la source
5
  1. Ouvert config/database.php
  2. Rechercher la strictclé dans mysqlles paramètres de connexion
  3. Définissez la valeur sur false
Boris Tetřev
la source
1

Essayez avec ça

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))
Jasim Juwel
la source
2
Bien que cela puisse répondre à la question, il est préférable d'expliquer les parties essentielles de la réponse et éventuellement quel était le problème avec le code OP.
pirho
1

Voici une manière plus Laravel de gérer le group by sans avoir besoin d'utiliser des instructions brutes.

$sources = $sources->where('age','>', 31)->groupBy('age');

$output = null;
foreach($sources as $key => $source) {
    foreach($source as $item) {
        //get each item in the group
    }
    $output[$key] = $source->count();
}
Vulfoliac
la source
8
C'est la mémoire et le traitement gourmands.
doncadavona
Même mémoire pb pour moi
Vince
0

Si vous souhaitez obtenir des données triées, utilisez également ceci

$category_id = Post::orderBy('count', 'desc')->select(DB::raw('category_id,count(*) as count'))->groupBy('category_id')->get();
Yuvraj Hinger
la source
0
$post = Post::select(DB::raw('count(*) as user_count, category_id'))->groupBy('category_id')->get();

Ceci est un exemple qui résulte du décompte des publications par catégorie.

Yuvraj Hinger
la source