如何使用范围的关系

时间:2014-10-24 07:50:33

标签: php laravel laravel-4 eloquent laravel-5

我已经用这种方式定义了我的Category模型:

class Category extends Eloquent
{
    public function parent()
    {
        return $this->belongsTo('Category', 'par_cat');
    }

    public function children()
    {
        return $this->hasMany('Category', 'par_cat', 'id');
    }
    public function scopeVisible($q)
    {
        return $q->whereActive(1)->whereAccepted(1);
    }

    public function scopeDefOrder($q) {
       return $q->orderBy('priority', 'ASC')->orderBy('name','ASC');
   }

}

现在,当我想使用范围获得具有预定义orderby的可见类别时,我可以执行以下操作:

$categories = Category::visible()->defOrder()->get();

但是,如果我想要看到可见的孩子呢?

我可以使用这样的语法:

$categories = Category::with(['children' =>function($q) {
         $q->visible()->defOrder();
     }])->visible()->defOrder()->get();

但是,仅使用儿童范围似乎有点过于复杂。还有其他方法吗?我可以想象使用例如:

$categories = Category::with('children#visible#defOrder')
          ->visible()->defOrder()->get();

但可能没有这样的结构。

我找到的唯一解决方案是创建一个额外的关系:

public function visibleDefOrderChildren()
{
    return $this->children()->visible()->defOrder();
}

现在我也可以使用:

$categories = Category::with('visibleDefOrderChildren')->visible()->defOrder()->get();

但是如果我有更多的范围而不是始终使用visible范围和defOrder范围,那么创建几十种方法只是为了使用范围来建立关系是没有意义的。

还有其他更简单的解决方案吗?或者我在闭包和创建额外方法之间做出选择以将范围附加到关系?

0 个答案:

没有答案