web-dev-qa-db-fra.com

Laravel éloquent comptant une relation

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é.

28
Arcade

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.

  • compter la requête par rapport au modèle d'emplacement
  • sélectionnez * parmi les lieux
  • sélectionnez * parmi les utilisateurs

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

36

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

7
iTech

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 )

4
Bogdan