web-dev-qa-db-fra.com

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

J'ai une table qui contient, entre autres colonnes, une colonne de versions de navigateur. Et je veux simplement savoir à partir du jeu d’enregistrements, combien de navigateurs de chaque type existent. Donc, je dois finir avec quelque chose comme ceci: Total Records: 10; Internet Explorer 8: 2; Chrome 25: 4; Firefox 20: 4. (Tous ajoutant jusqu'à 10)

Voici mes deux pence:

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

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

79
kJamesy

Cela fonctionne pour moi:

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

Cela fonctionne pour moi (Laravel 5.1):

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

Merci Antonio,

Je viens d'ajouter la commande lists à la fin, de sorte qu'elle ne renvoie qu'un 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();
18
Diogo Gomes

Cela fonctionne aussi bien, un peu plus soigné. getQuery() renvoie simplement le générateur sous-jacent, qui contient déjà la référence de la table.

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
                     ->select('browser', $browser_total_raw)
                     ->groupBy('browser')
                     ->pluck('total','browser');
9
Yauheni Prakopchyk

Si vous souhaitez obtenir une collection, groupBy et comptez:

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

À votre santé!

8
Adam Kozlowski
  1. Ouvrir config/database.php
  2. Trouver strict clé dans mysql paramètres de connexion
  3. Définissez la valeur sur false
5
Boris Tetřev

Voici un moyen plus Laravel de gérer un groupe 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();
}
1
Vulfoliac

J'ai eu un problème de compte en utilisant GroupBy. Alors j'ai fait:

$queryWithGroupBy->getQuery()->getCountForPagination(); //return int

Le problème avec $ queryWithGroupBy-> get () -> count () est que la requête est exécutée avant de compter les résultats, ce qui est inutile, car vous pouvez compter ($ queryWithGroupBy-> get ()).

0
Umair Hamid

Essayez avec ça

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