使用查询范围预先加载相关模型

时间:2014-04-08 15:50:58

标签: laravel eloquent

假设我有一个包含许多小部件的模型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'),但我还没有找到它。

1 个答案:

答案 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