我已经用这种方式定义了我的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
范围,那么创建几十种方法只是为了使用范围来建立关系是没有意义的。
还有其他更简单的解决方案吗?或者我在闭包和创建额外方法之间做出选择以将范围附加到关系?