2012-11-02 3 views
27

Je suis nouveau à laravel et éloquent et je ne suis pas sûr si c'est même possible. mais j'ai 2 tables avec une relation de un à plusieurs. L'un est «lieux» et l'autre est «utilisateurs». Un emplacement peut avoir plusieurs utilisateurs.Laravel éloquent compter une relation

Donc, si je voulais obtenir tous les lieux avec tous les utilisateurs, je voudrais juste faire:

Location::with("users")->get(); 

Mais je veux aussi savoir combien d'utilisateurs chaque emplacement a, j'essayé de faire ce

Location::with("users")->count("users")->get(); 

Mais cela n'a pas fonctionné.

+0

Qu'avez-vous fait à ce jour pour savoir? Je ne veux pas dire que quelqu'un suggère quelque chose que vous avez déjà fait. – hakre

+0

Si la documentation était vérifiée mais que vous ne pouviez rien en trouver – Arcade

+0

Si 'Location :: with (" users ") -> get();' alors 'Location :: with (" users ") -> count() 'pourrait aussi fonctionner. Avez-vous essayé cela (je viens de scanner les docs, jamais utilisé cette bibliothèque). – hakre

Répondre

34

Le problème n + 1 qui a été mentionné ne se produit pas si vous utilisez le chargement impatient.

$locations = Location::with('users')->get(); 

$locations->users()->count(); 

Cela devrait aboutir à trois requêtes, quel que soit le nombre d'utilisateurs ou d'emplacements.

  • comptage requête sur le modèle de l'emplacement
  • select * à partir d'emplacements
  • select * des utilisateurs où dans

La confusion provient du fait que cela fonctionne aussi:

$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

+9

Bien que tard dans la soirée, je tiens juste à souligner que vous avez toujours le problème n + 1.Vous devez utiliser '$ location> users-> count()' dans une foreach, ne pas accéder à la méthode users(), mais accéder à la propriété, ou faire une requête à chaque fois. – David

+0

@David merci beaucoup, vous avez aidé à dissiper la confusion car je voyais toujours un problème n + 1. Il serait utile de mettre à jour cette réponse pour être plus précis. –

7

Vous devez appeler la méthode de comptage sur chaque enregistrement d'emplacement pour obtenir les utilisateurs comptent 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 par chaque emplacement. Vous pouvez ajouter une vérification dans la boucle pour ignorer les emplacements avec le compte des utilisateurs = 0

+6

Est-ce que cela utiliserait autant de requêtes DB que celles provenant de Location :: get()? –

+32

C'est mauvais. Il en résulte un [problème de requête n + 1] (http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue?lq=1) – edi9999

+0

Dans ce cas, il vaut mieux utiliser Collection. Parce que ainsi vous utilisez le PHP pour le compte des relations. '$ location-> users-> count()' –

Questions connexes