在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