Comment additionner et regrouper par dans Laravel en utilisant Eloquent
Dans cette requête, l'objectif est d'utiliser Eloquent pour calculer la somme d'un colonne spécifique tout en regroupant les résultats en fonction d’une autre colonne. L'exemple donné dans la question, où la somme de la colonne no_of_pages doit être regroupée par users_editor_id, sert d'illustration pratique.
La tentative initiale, fournie dans la question, souffre d'un problème logique. Puisque sum() exécute instantanément la requête et renvoie le résultat, le regroupement est tenté une fois que la requête a déjà été traitée. Laravel ne prend pas en charge l'application du regroupement après l'exécution de la requête, d'où l'erreur.
Pour résoudre ce problème, il est nécessaire de modifier la structure de la requête. Au lieu d'utiliser groupBy() après sum(), commencez par regrouper les résultats à l'aide de groupBy('users_editor_id'). Cela créera efficacement des sous-requêtes pour chaque valeur user_editor_id unique.
Ensuite, ajoutez une clause selectRaw() pour spécifier les colonnes d'intérêt à partir des résultats groupés. Dans ce cas, il s'agit de la somme agrégée : sum(no_of_pages) as sum.
Enfin, utilisez pluck() pour extraire uniquement les colonnes sum et users_editor_id du résultat. Cela renverra un tableau avec users_editor_id comme clé et la somme correspondante comme valeur.
Voici la requête révisée :
Document::groupBy('users_editor_id') ->selectRaw('sum(no_of_pages) as sum, users_editor_id') ->pluck('sum','users_editor_id');
Une approche alternative consiste à utiliser une clause selectRaw() pour incluez sum(no_of_pages) comme colonne supplémentaire dans la sous-requête. Cependant, cette méthode produit une collection de pseudo-modèles qui contiennent les colonnes d'origine et la somme calculée comme champ supplémentaire.
Document::groupBy('users_editor_id') ->selectRaw('*, sum(no_of_pages) as sum') ->get();
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!