Laravel 5-多对多关系上的专用查询字符串过滤


Laravel 5 - Dedicated Query string filtering on many-to-many Relationship

我用以下源代码遵循了一个教程:https://github.com/laracasts/Dedicated-Query-String-Filtering/tree/master/app

如果你有laracast,你可以在这里观看视频

我喜欢实现的是根据产品类别过滤产品。

当我对产品本身进行过滤时,它运行良好

class ProductFilter extends QueryFilter
{
    public function categorie($name)
    {
        return $this->builder->where('name' , $name);
    }
}

但当我试图过滤这种关系时,它是行不通的。(我也没有错)错误位于该文件中,我认为

class ProductFilter extends QueryFilter
{
    public function categorie($name)
    {
        return $this->builder->categories()->where('name' , $name);
    }
}

查看

<form  method="get" action="/producten/categorie" style="display:inline-block">
 @foreach($roots as $root)
   <li><button type="submit" name="categorie" value="{{$root->name}}" class="button-link">{{$root->name}}</button></li>
 @endforeach
</form>

路线

Route::get('producten/categorie' , 'FrontProductController@index');

FrontProductController

  public function index(ProductFilter $filters)
    {
        Product::filter($filters)->get();
    }

QueryFilter类

abstract class QueryFilter
{
    protected $request;
    protected $builder;
    public function __construct(Request $request)
    {
        $this->request = $request;
    }
    public function apply(Builder $builder)
    {
        $this->builder = $builder;
        foreach ($this->filters() as $name => $value) {
            if (! method_exists($this, $name)) {
                continue;
            }
            if (strlen($value)) {
                $this->$name($value);
            } else {
                $this->$name();
            }
        }
        return $this->builder;
    }
    public function filters()
    {
        return $this->request->all();
    }
}

产品型号

  public function categories()
  {
      return $this->belongsToMany('App'Category')->withTimestamps();
  }
 public function scopeFilter($query, QueryFilter $filters)
   {
       return $filters->apply($query);
   }

在产品过滤器中,我需要对多对多关系执行以下操作:

public function category($name)
    {
        return $this->builder->whereHas('categories', function ($query) use ($name) {
            $query->where('name', $name);
        });
    }