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?

Réponses:


217

Cela fonctionne pour moi:

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

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();

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();

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é!


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');

5
  1. Ouvert config/database.php
  2. Rechercher la strictclé dans mysqlles paramètres de connexion
  3. Définissez la valeur sur false

1

Essayez avec ça

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))

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();
}

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();

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.