2014-04-08 10 views
7

Załóżmy, że mam model Box zawierający wiele widżetów. Widżety mogą być aktywne lub nieaktywne (boolean). Model Widget ma zakres kwerendy, które mogą filtrować wyniki:Chętny model związany z ładowaniem za pomocą zakresu zapytania

modele/box.php:

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

modele/widget.php:

class Widget extends Eloquent { 

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

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

zakresy zapytań sprawiają, że łatwo dostać wszystko widżety dla danego pola:

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

Ale jak mogę użyć scopeActive do wyeliminować tę zachłanną funkcję warunkową?

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

Wydaje się, że prawdopodobnie jest to skrót od dostępu zakresu relacji tych, coś jak Box::with('widgets->active') lub Box::with('widgets.active') ale nie udało się go odnaleźć.

Odpowiedz

13

Załóżmy większość czasu chcesz tylko aktywne widżety, więc proponuję:

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

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

można skonfigurować nawet więcej, na przykład do załadunku wszystkie na raz, jak masz teraz.

Następnie chętni obciążenie tak łatwo, jak:

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

Prawie dokładnie to, czego szukałam, dziękuję! Aby wyjaśnić, są to metody modelu Box. Zapewnia to również zestawy o różnych nazwach, co jest świetne. – joemaller

+0

Tak, oczywiście należą one do modelu Box. Używanie różnych nazw dla relacji, jakie masz, jest naprawdę wspaniałe, ponieważ możesz sprawić, że kod będzie gadatliwy i łatwy w użyciu –

Powiązane problemy