假设我有一个包含许多小部件的模型Box
。窗口小部件可以是活动的或非活动的(布尔值)。 Widget
模型具有可以过滤结果的查询范围:
模型/ box.php:
class Box extends Eloquent
{
public function widgets()
{
return $this->hasMany('Widget');
}
}
模型/ widget.php:
class Widget extends Eloquent {
public function box()
{
return $this->belongsTo('Box');
}
public function scopeActive($query)
{
return $query->whereActive(true);
}
}
查询范围可以轻松获取给定框的所有小部件:
$box_widgets = Box::find($box_id)->widgets()->active()->get();
// returns an Eloquent\Collection containing a filtered array of widgets
但是如何使用scopeActive
来消除这种急切加载with
方法的条件函数?
$boxes = Box::with(array('widgets', function ($q)
{
$q->active();
}))->get();
似乎可能是访问关系范围的简写,例如Box::with('widgets->active')
或Box::with('widgets.active')
,但我还没有找到它。
答案 0 :(得分:13)
假设大多数时候你只想要活动的小部件,所以我建议:
public function widgets()
{
return $this->hasMany('Widget')->whereActive(true);
}
public function widgetsDisabled()
{
return $this->hasMany('Widget')->whereActive(false);
}
您可以设置更多,例如一次加载所有内容,就像您现在一样。
然后急切加载:
Box::with('widgets')... // loads only active