2012-11-02 10 views
27

Jestem nowy w laravel i elokwentny i nie jestem pewien, czy to jest nawet możliwe. ale mam 2 tabele z jednym do wielu relacji. Jedna to "lokalizacje", a jedna to "użytkownicy". Jedna lokalizacja może mieć wielu użytkowników.Laravel elokwentnie licząc relację

Więc jeśli chcę uzyskać wszystkie lokalizacje z wszystkich użytkowników Chciałbym po prostu to zrobić:

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

Ale chcę wiedzieć, ilu użytkowników każdy lokalizacja ma, próbowałem robić to

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

Ale to nie zadziałało.

+0

co robiłeś do tej pory się dowiedzieć? Chodzi o to, że ktoś nie sugeruje czegoś, co już zrobiłeś. – hakre

+0

Jeśli sprawdzanie dokumentacji, ale naprawdę nie może znaleźć nic na ten temat – Arcade

+0

Jeśli "Lokalizacja :: z (" użytkownicy ") -> get();' następnie 'Lokalizacja :: z (" użytkownicy ") -> count() ; 'może też działać. Czy próbowałeś tego (właśnie przeskanowałem dokumenty, nigdy nie korzystałem z tej biblioteki) ?. – hakre

Odpowiedz

34

Wymieniony problem n + 1 nie występuje, jeśli używasz szybkiego ładowania.

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

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

To powinno skutkować trzech zapytań, bez względu na to, ilu użytkowników lub miejsca masz.

  • zapytania wliczane do modelu lokalizacji
  • select * from lokalizacjach
  • select * from użytkowników gdzie w

Zamieszanie wynika z faktu, że to działa również:

$locations = Location::all(); 

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

Ale w tym przypadku zapytanie dotyczy tylko jednej lokalizacji.

Zobacz docs o więcej informacji: http://laravel.com/docs/eloquent#eager-loading

+9

Mimo, że spóźniłeś się na imprezę, tak jak wskazujesz, nadal masz problem z tym związany.Musisz użyć '$ location> users-> count()' w foreach, w zasadzie nie ma dostępu do metody users(), ale dostęp do właściwości, lub za każdym razem wykonuje zapytanie. – David

+0

@David dziękuję bardzo, pomógł wyjaśnić zamieszanie, ponieważ nadal widziałem problem n + 1. Pomoże to zaktualizować tę odpowiedź, aby była bardziej dokładna. –

7

Trzeba wywołać metodę liczyć na każdego rekordu lokalizacja, aby dostać użytkownicy liczą na miejscu, oto przykład:

foreach(Location::get() as $location) // or foreach(Location::with("users")->get() as $location) 
{ 
    echo $location->users()->count(); 
} 

To powinno rozwiązać problem i daje liczbę użytkowników na każdym miejscu. Możesz dodać zaznaczenie w pętli, aby zignorować lokalizacje z liczbą użytkowników = 0

+6

Czy użyjesz tak wielu zapytań DB, jak wynika z Location :: get()? –

+32

To jest złe. Powoduje to problem z zapytaniem [n + 1] (http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue?lq=1) – edi9999

+0

W tym przypadku lepiej jest użyć kolekcji. Ponieważ w ten sposób używasz PHP do liczenia relacji. '$ location-> users-> count()' –

Powiązane problemy