2016-04-15 191 views
1

我跟着這個源代碼的教程專用的查詢字符串過濾: https://github.com/laracasts/Dedicated-Query-String-Filtering/tree/master/appLaravel 5 - 許多一對多的關係

如果你有laracasts你可以觀看視頻here

我喜歡什麼實現是基於其類別的過濾產品。

當我對產品本身進行過濾,它工作正常

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' , '[email protected]'); 

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); 
    } 

回答

1

在產品過濾器我需要做許多一對多的關係如下:

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