2017-07-12 156 views
1

我有一個resource控制器,我正在開發用於顯示可以通過TypeCustomer被過濾記錄的API和我有以下幾種方法,可以得到這樣的數據:Laravel資源控制器用於過濾

index

show - >需要一個parameter (id)

能否因此把requestindex方法內,用於過濾的所有條目的背面或是過b廣告的做法呢?我的代碼如下所示:

public function index() 
    { 
      $entries = \App\Ent::where(function($en) { 
       $request = app()->make('request'); 

       if($request->has('type')) { 
        $en->where('type', '=', $request->get('type')); 
       } 

       if($request->has('customer')) { 
        $en->where('customer', '=', $request->get('customer')); 
       } 

      })->get(); 

      dd($entries); 
    } 

回答

1

在Laravel中過濾非常簡單,您不需要執行此操作。在你Ent模型,定義如下:

public function scopeFilter($query, $filters) 
    { 
    if(isset($filters['type'])){ 
     $query->where('type', '=', $filters['type']); 
    } 
    // keep going for all of your filters 
    } 

並在您的控制器的索引方法,你可以:

public function index() 
{ 
    $entries = \App\Ent::filter(['type', 'customer'])->get(); 
    dd($entries); 
} 

編輯

爲了幫助你做出更多的這個意義上說,我們的過濾器Ent在數據庫中的type列。

路線:

Route::get('/ent', '[email protected]'); 

耳鼻喉科型號:

class Ent extends Model 
{ 
    public function scopeFilter($query, $filters) 
    { 
    if(isset($filters['type'])){ 
     $query->where('type', '=', $filters['type']); 
    } 
    } 
} 

耳鼻喉科控制器:

class EntController extends Controller { 
    index() 
    { 
    $entries = \App\Ent::filter(['type'])->get(); 
    return view('ent.index', compact('entries')); 
    } 
} 

比方說,這個例子的目的,我們只是要在放形式我們正在輸出我們的清單的相同刀片模板:

@foreach($entries as $entry) 
<p>{{ $entry->type }}</p> 
@endforeach 

<form method="GET" action="/ent"> 

{{ csrf_field() }} 

<input type="text" name="type" /> 

<input type="submit" value="Filter" /> 

</form> 

所以,現在,如果我進入那個形式和類型的「富酒吧」並點擊提交,你會得到什麼會是這個樣子的SQL

SELECT * FROM Ent WHERE type='foo bar'

或者換句話說,全部Enttype='foo bar'。

當我讓用戶輸入原始文本進行過濾時,我喜歡給他們帶來懷疑的好處,並使用LIKE而不是=。因此,例如,我們只想改變我們的scopeFilter方法:

if(isset($filters['type'])){ 
    $query->where('type', 'LIKE', '%' . $filters['type'] . '%'); 
} 

的另一件事,這裏要注意的filters[name]<input>字段的名稱,而不是在你的數據庫中的列名。您的目標是$query擴展中的列,而不是$filters陣列中的列。見下面的例子:

if(isset($filters["ent_type"]){ 
$query->where('type', '=', $filters["ent_type"]); 
} 

在我的形式,這將是

<input name="ent_type" type="text" /> 
+0

十分感謝。是「type」,「customer」變量而不是被過濾的東西的實際名稱?因爲這些將通過網址傳遞。就像'?type = Car&'正在輸出'dd($ filters ['type']''會顯示'type',我想要實際的值 – Phorce

+0

是的,'$ filter [name ]''GET''或'POST'變量的名稱,然後在acutal查詢修飾符中,你的目標是你的DB列 –

+0

儘管''request-> get('type');/=「Testing」'so so:':: filter([$ request-> get('type'),'customer']) - > get();'這個值就是'Testing',它意味着模型,if語句永遠不會被觸發? – Phorce