2017-10-03 3 views
0

J'utilise laravel 5.4. Imaginez que je veux montrer de la publicité automobile. J'obtiendrai tous les dossiers de voiture d'une table et les chargerai dans ma page. Maintenant je veux montrer plusieurs catégories avec des comptes dans une barre latérale (types de voiture, couleurs de voiture, carburants de voiture) et je veux montrer le compte pour chaque catégorie. Par exemple: nous avons 10 annonces auto, deux d'entre elles sont en rouge, trois sont en vert et cinq en blanc. Je veux avoir quelque chose comme ça dans une barre latérale:Comment groupby avec count en laravel pour plusieurs champs

red(2) 
green(3) 
white(5) 

Je l'ai fait avec SQL groupBy:

 $colors = DB::table('advertisments')->select('color_name', DB::raw('count(color_name) as total_color'))->groupBy('color_name')->get(); 
     $gearboxes = DB::table('advertisments')->select('gearbox', DB::raw('count(gearbox) as total_gearbox'))->groupBy('gearbox')->get(); 
     $param = ['colors' => $colors,'gearboxes' => $gearboxes]; 
     return view('ads' , compact('ads','param')); 

Cependant, j'ai des dizaines de catégories et je ne peux pas le faire avec un groupBy si la nombre de requêtes va être trop élevé. Existe-t-il un moyen de le faire avec une seule requête ou avec moins de requêtes?

+0

Que voulez-vous? Requête sql avec un code group by ou laravel? –

+0

Cela n'a pas d'importance, je veux juste faire ça. Mais je pense que c'est seulement possible avec sql et groupe par –

Répondre

1

Vous pouvez utiliser un tableau pour faciliter l'exécution de vos différentes colonnes.

$params = []; 
$columns = [ 
    'colors' => 'color_name', 
    'gearboxes' => 'gearbox', 
    // put your other columns in this array 
]; 

foreach($columns as $name => $column) 
    $params[$name] = DB::table('advertisments')->select($column, DB::raw('count(' . $column . ') as total'))->groupBy($column)->get(); 

return view('ads' , compact('ads','param')); 
+0

merci. c'est moins de code mais c'est encore des dizaines de requêtes. est-il possible de réduire les requêtes? –

+1

Je ne crois pas que ce soit des colonnes différentes. Vous pouvez utiliser des sous-requêtes, mais celles-ci sont toujours considérées comme des requêtes. Vous perdrez l'attente de la réponse de la base de données à chaque fois, mais tant que votre base de données est sur le même serveur, ou le même centre de données que votre serveur web, je ne vois pas d'énorme amélioration possible des performances. – PeterBechP

+0

Ok, donc je vais le faire par plusieurs groupes par et je pense que sa meilleure façon et pas mal –