Laravel: Abfragen und Zugreifen auf untergeordnete Objekte in verschachtelter Beziehung mit where-Klauseln

8

Ich versuche, auf die untergeordneten Objekte verschachtelter Beziehungen zuzugreifen, die viele Ergebnisse vom übergeordneten Objekt zurückgeben.

Sagen wir, ich habe 4 Modelle: Land - Provinzen - Städte - Gemeinden

Ihre Beziehungen sind wie folgt:

Ländermodell

%Vor%

Provinzmodell

%Vor%

Stadtmodell

%Vor%

Gemeinde-Modell

%Vor%

Nun versuche ich, alle Gemeinden in einem bestimmten Land zu erreichen, die über 9000 Einwohner haben und sich in Provinzen befinden, die als Westen gelten.

Bisher habe ich so etwas:

%Vor%

Jetzt kann ich leicht die Provinzen mit $country->provinces erreichen, aber ich kann nicht tiefer gehen.

EDIT1: Behebung der von Jarek bemerkten toes-to-Beziehung.

EDIT2: Zusätzlich zu Jareks Antwort wollte ich teilen, was ich auch gefunden habe, aber Jarek ist wahrscheinlich die richtige Methode.

Anstatt zu versuchen, von oben nach unten zu gehen (Country - & gt; Municipality) Ich entschied mich, den anderen Weg zu versuchen (Gemeinde - & gt; Country) Hier ist, wie es funktioniert (und ich habe es getestet, funktioniert auch)

%Vor%

Ich habe keine Ahnung, ob dies ein richtiger Weg ist oder ob Leistung akzeptiert würde, aber es scheint mir den Trick zu geben, aber Jareks Antwort sieht eleganter aus.

    
sholmes 07.09.2014, 20:02
quelle

1 Antwort

9

Ihr Municipality - City ist wahrscheinlich belongsTo , nicht hasMany wie in der Paste.

Wie auch immer, Sie können hasManyThrough relation verwenden, um auf weit verwandte Sammlungen zuzugreifen:

%Vor%

Leider gibt es keine Beziehung für die Verschachtelung auf drei Ebenen, also kann man das nicht einfach so machen.

Als Nächstes begrenzt Ihr Code mit whereHas provinces nicht auf west und municipalities auf 9000+ , sondern begrenzt nur countries auf diejenigen, die damit in Zusammenhang stehen. In Ihrem Fall bedeutet dies, dass das Ergebnis entweder Country ist (wenn seine Beziehungen diesen Anforderungen entsprechen) oder null andernfalls.

Wenn Sie also verwandte Sammlungen wirklich einschränken wollen, brauchen Sie dieses Stück:

%Vor%

Dies ist die Anwendung von "eager loading constraints" und was es tut ist:

%Vor%

Da Sie sich nicht für Städte interessieren, können Sie hasManyThrough für die Provinz verwenden:

%Vor%

dann:

%Vor%

In beiden Fällen können Sie jedoch nicht direkt auf die Gemeinden zugreifen, sondern nur so:

%Vor%

Wenn Sie mit all diesen Gemeinden arbeiten möchten, brauchen Sie diesen Trick:

%Vor%

Dies wird zusätzliche Abfragen ausführen, aber jetzt sind alle Gemeinden in einer einzigen, flachen Sammlung, so dass es sehr einfach ist, damit zu arbeiten. Andernfalls enden Sie wahrscheinlich mit einer Reihe von foreach Schleifen.

    
Jarek Tkaczyk 07.09.2014, 21:11
quelle