我用以下源代码遵循了一个教程: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);
});
}