【问题标题】:Eager loading related model using query scope使用查询范围急切加载相关模型
【发布时间】:2014-05-21 10:38:35
【问题描述】:

假设我有一个模型Box,其中包含许多小部件。小部件可以是活动的或非活动的(布尔值)。 Widget 模型有一个可以过滤结果的查询范围:

models/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'),但我找不到它。

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    假设大多数时候你只想要活动的小部件,所以我建议:

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

    您可以设置更多,例如一次加载所有内容,就像现在一样。

    然后像这样轻松加载:

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

    【讨论】:

    • 几乎正是我想要的,谢谢!澄清一下,这些是 Box 模型的方法。这也为集合提供了不同的名称,这很棒。
    • 是的,它们当然属于 Box 模型。为你所拥有的关系使用不同的名称确实很棒,因为你可以使代码冗长且易于使用
    猜你喜欢
    • 2016-08-17
    • 2013-06-10
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多