在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'
或者換句話說,全部Ent
與type
列=
'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" />
十分感謝。是「type」,「customer」變量而不是被過濾的東西的實際名稱?因爲這些將通過網址傳遞。就像'?type = Car&'正在輸出'dd($ filters ['type']''會顯示'type',我想要實際的值 – Phorce
是的,'$ filter [name ]''GET''或'POST'變量的名稱,然後在acutal查詢修飾符中,你的目標是你的DB列 –
儘管''request-> get('type');/=「Testing」'so so:':: filter([$ request-> get('type'),'customer']) - > get();'這個值就是'Testing',它意味着模型,if語句永遠不會被觸發? – Phorce