1

私は自分の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');
   }

}

スコープを使用して、事前定義された順序で可視カテゴリを取得したい場合は、次のようにすることができます。

$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();

しかし、おそらくそのような構造はありません。

私が見つけた唯一の解決策は、もう 1 つの追加の関係を作成することです。

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

そして今、私はまた使用することができます:

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

しかし、より多くのスコープがあり、常にvisibleスコープとdefOrderスコープを使用しない場合、関係のためにスコープを使用するためだけに多数のメソッドを作成しても意味がありません。

他にもっと簡単な解決策はありますか?または、関係にスコープを追加するために、閉鎖と追加のメソッドの作成のどちらかを選択する必要がありますか?

4

0 に答える 0