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źć.
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
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 –