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.
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:
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:
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.
Tags und Links nested laravel eloquent relationships