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?
Cela fonctionne pour moi:
$user_info = DB::table('usermetas')
->select('browser', DB::raw('count(*) as total'))
->groupBy('browser')
->get();
Cela fonctionne pour moi (Laravel 5.1):
$user_info = Usermeta::groupBy('browser')->select('browser', DB::raw('count(*) as total'))->get();
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();
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');
Si vous souhaitez obtenir une collection, groupBy et comptez:
$collection = ModelName::groupBy('group_id')
->selectRaw('count(*) as total, group_id')
->get();
À votre santé!
config/database.php
strict
clé dans mysql
paramètres de connexionfalse
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();
}
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 ()).
->groupBy('state_id','locality')
->havingRaw('count > 1 ')
->having('items.name','LIKE',"%$keyword%")
->orHavingRaw('brand LIKE ?',array("%$keyword%"))