Je suis nouveau à laravel et éloquent et je ne sais pas si c'est même possible. Mais j'ai 2 tables avec une relation un à plusieurs. L'une est "emplacements" et l'autre est " utilisateurs ". Un emplacement peut avoir plusieurs utilisateurs.
Donc, si je voulais obtenir tous les emplacements avec tous les utilisateurs, je ferais simplement ceci:
Location::with("users")->get();
Mais je veux aussi savoir combien d'utilisateurs chaque emplacement, j'ai essayé de le faire
Location::with("users")->count("users")->get();
Mais cela n'a pas fonctionné.
Le problème n + 1 qui a été mentionné ne se produit pas si vous utilisez un chargement rapide.
$locations = Location::with('users')->get();
$locations->users()->count();
Cela devrait entraîner trois requêtes, quel que soit le nombre d'utilisateurs ou d'emplacements dont vous disposez.
La confusion vient du fait que cela fonctionne également:
$locations = Location::all();
$locations->users()->count();
Mais dans ce cas, il interroge une fois pour chaque emplacement.
Voir la documentation pour plus d'informations: http://laravel.com/docs/eloquent#eager-loading
Vous devez appeler la méthode de comptage sur chaque enregistrement d'emplacement pour obtenir le nombre d'utilisateurs par emplacement, voici un exemple:
foreach(Location::get() as $location) // or foreach(Location::with("users")->get() as $location)
{
echo $location->users()->count();
}
Cela devrait résoudre votre problème et vous donner le nombre d'utilisateurs pour chaque emplacement. Vous pouvez ajouter une vérification dans la boucle pour ignorer les emplacements avec le nombre d'utilisateurs = 0
Vous devriez utiliser simplement withCount
mais je suppose que ce n'était pas disponible en 2012.
Voici à quoi cela devrait ressembler:
Location::with("users")->withCount("users")->get();
Et vous aurez un users_count
attribut disponible sur votre objet.
Lisez les documents pour plus de détails: https://laravel.com/docs/5.5/eloquent-relationships#querying-relations (faites défiler un peu et vous verrez Compter les modèles associés )