2014-04-08 11 views
7

Sagen wir, ich habe ein Modell Box, die viele Widgets enthält. Die Widgets können aktiv oder inaktiv sein (boolean). Das Widget Modell verfügt über eine Abfragebereich, die Ergebnisse filtern:Eager Laden verwandte Modell mit Abfragebereich

models/box.php:

class Box extends Eloquent 
{ 
    public function widgets() 
    { 
     return $this->hasMany('Widget'); 
    } 
} 

models/widget.php:

class Widget extends Eloquent { 

    public function box() 
    { 
     return $this->belongsTo('Box'); 
    } 

    public function scopeActive($query) 
    { 
     return $query->whereActive(true); 
    } 
} 

Abfrage Tive es einfach alles zu bekommen Widgets für ein bestimmtes Feld:

$box_widgets = Box::find($box_id)->widgets()->active()->get(); 
// returns an Eloquent\Collection containing a filtered array of widgets 

Aber wie kann ich scopeActive zu beseitigen diese eifrig laden with Methode bedingte Funktion?

$boxes = Box::with(array('widgets', function ($q) 
{ 
    $q->active(); 
}))->get(); 

Es scheint, als gäbe es wohl eine Abkürzung für eine Beziehung des Oszilloskops zugreifen, so etwas wie Box::with('widgets->active') oder Box::with('widgets.active') aber ich habe nicht in der Lage gewesen, es zu finden.

Antwort

13

Es sei die meiste Zeit wollen Sie nur aktive Widgets, so schlage ich vor:

public function widgets() 
{ 
    return $this->hasMany('Widget')->whereActive(true); 
} 

public function widgetsDisabled() 
{ 
    return $this->hasMany('Widget')->whereActive(false); 
} 

Sie können Setup up mehr, zum Beispiel zum Laden auf einmal, wie Sie jetzt haben.

Dann eifrig Last so leicht wie das:

Box::with('widgets')... // loads only active 
+0

So ziemlich genau das, was ich suchte, danke! Nur um dies zu verdeutlichen, sind dies Methoden des Box-Modells. Dies bietet auch die Sets mit unterschiedlichen Namen, was großartig ist. – joemaller

+0

Ja, natürlich gehören sie zum Box-Modell. Verschiedene Namen für die Beziehungen wie Sie haben, ist in der Tat groß, wie Sie den Code ausführlich und einfach zu bedienen machen können –