Laravel: Abfragen und den Zugriff auf untergeordnete Objekte in verschachtelten Beziehung mit where-Klauseln

Ich versuche, um Zugriff auf die untergeordneten Objekte in den verschachtelten Beziehungen, die viele Ergebnisse aus dem Eltern-Objekt.

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

Ihre Beziehungen sind wie folgt :

Land Modell

class Country extends Eloquent
{
   protected $table = 'countries';

   public function provinces()
   {
       return $this->hasMany('Province');
   }
}

Provinz Modell

class Province extends Eloquent
{
   protected $table = 'provinces';

   public function cities()
   {
       return $this->hasMany('City');
   }
   public function country()
   {
       return $this->belongsTo('Country');
   }
}

Stadt-Modell

class City extends Eloquent
{
   protected $table = 'cities';

   public function municipalities()
   {
       return $this->hasMany('Municipality');
   }
   public function province()
   {
       return $this->belongsTo('Province');
   }
}

Gemeinde Modell

class Municipality extends Eloquent
{
   protected $table = 'municipalities';

   public function cities()
   {
      return $this->belongsTo('City');
   }
 }

Nun, was ich versuche zu tun ist, erhalten alle Gemeinden in einem bestimmten Land, das eine Bevölkerung von über 9000 und befinden sich in Provinzen, die als West.

Bisher habe ich so etwas wie dieses :

   $country_id = 1;

   $country = Country::whereHas('provinces', function($query){
        $query->where('location', 'West');
        $query->whereHas('cities', function($query){ 
            $query->whereHas('municipalities', function($query){
                $query->where('population', '>', 9000);
            });            
        });
    })->find($country_id); 

Kann ich jetzt einfach die Provinzen mit $country->provinces aber ich kann nicht noch tiefer als das.

EDIT1 : Befestigung der belongsTo-Beziehung, wie bemerkt, durch Jarek.

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

Anstatt zu versuchen, um zu gehen von oben nach unten (Land -> Gemeinde), habe ich beschlossen, zu versuchen, den anderen Weg (Gemeinde -> Land) Hier ist, wie es funktioniert (und ich es getestet habe, funktioniert auch)

          $municipalities = Municipality::where('population', '>', 9000)
            ->whereHas('city', function($q) use ($country_id){
                $q->whereHas('province', function($q) use ($country_id){
                    $q->where('location', 'West');
                    $q->whereHas('country', function($q) use ($country_id){
                          $q->where('id', $country_id);
                    });
                });
            })->get();

Ich habe keine Ahnung, ob dies eine tatsächliche richtige Weg, oder wenn die Leistung akzeptiert werden würde, aber es schien, den trick zu tun für mich jedoch Jarek die Antwort sieht eher elegant.

InformationsquelleAutor sholmes | 2014-09-07
Schreibe einen Kommentar