2012-11-02 38 views
27

Ich bin neu zu Laravel und eloquent und ich bin mir nicht sicher, ob das überhaupt möglich ist. aber ich habe 2 Tabellen mit einer Eins-zu-viele-Beziehung. Einer ist "Standorte" und einer ist "Benutzer". Ein Standort kann viele Benutzer haben.Laravel eloquent eine Beziehung zählen

Also, wenn ich wollte, dass alle Standorte mit allen Benutzern bekommen würde ich dies nur tun:

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

Aber ich möchte auch wissen, wie viele Benutzer jeder Standort hat, habe ich versucht diese

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

Aber das hat nicht funktioniert.

+0

Was Sie bisher getan haben, um herauszufinden? Ich meine nicht, dass jemand etwas vorschlägt, was du bereits getan hast. – hakre

+0

Wenn ich die Dokumentation überprüft habe, aber nichts finden kann – Arcade

+0

Wenn 'Location :: with (" Benutzer ") -> get();' then 'Location :: with (" Benutzer ") -> count() ; 'könnte auch funktionieren. Hast du das versucht (ich habe gerade die Dokumente gescannt, habe diese Bibliothek noch nie benutzt)? – hakre

Antwort

34

Das n + 1-Problem, das erwähnt wurde, tritt nicht auf, wenn Sie eifrig laden verwenden.

Dies sollte zu drei Abfragen führen, egal wie viele Benutzer oder Standorte Sie haben.

  • Anzahl Abfrage des Standortmodell
  • select * from Standorte
  • select * von den Benutzern, wo in

Die Verwirrung entsteht aus der Tatsache, dass dies auch funktioniert:

$locations = Location::all(); 

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

Aber in diesem Fall fragt es einmal für jeden Standort ab.

die Dokumentation für weitere Informationen siehe: http://laravel.com/docs/eloquent#eager-loading

+9

Obwohl spät auf die Party, nur um darauf hinzuweisen, dass Sie immer noch das n + 1 Problem damit bekommen.Sie müssen '$ location> users-> count()' in einer foreach verwenden, grundsätzlich nicht auf die Methode users() zugreifen, sondern auf die Eigenschaft zugreifen, oder es wird jedes Mal eine Abfrage ausgeführt. – David

+0

@David Vielen Dank, Sie haben geholfen, die Verwirrung zu klären, da ich immer noch ein n + 1 Problem sah. Es würde helfen, diese Antwort zu aktualisieren, um genauer zu sein. –

7

Sie müssen die Zählmethode auf jedem Ort Datensatz aufrufen Benutzer pro Standort zählen zu bekommen, hier ein Beispiel:

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

Dies sollte Ihr Problem lösen und geben Sie die Anzahl der Benutzer pro jedem Standort. Sie können eine Überprüfung in der Schleife hinzufügen, um Standorte mit Benutzern zu ignorieren. Count = 0

+6

Würde dies so viele DB-Abfragen verwenden wie Ergebnisse von Location :: get()? –

+32

Das ist schlecht. Es führt zu einem [n + 1-Abfrageproblem] (http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue?lq=1) – edi9999

+0

In diesem Fall ist die Verwendung von Sammlung besser. Weil Sie also PHP für die Anzahl der Beziehungen verwenden. '$ location-> users-> count()' –

Verwandte Themen