我有一个resource
控制器用于我正在开发的用于显示可以通过Type
和Customer
过滤的记录的API,我有以下方法可以获取此数据:
index
show
- >需要parameter (id)
因此,我可以在request
方法中放置index
来过滤所有条目,或者这样做是不好的做法?我的代码如下所示:
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);
}
答案 0 :(得分:2)
在Laravel中过滤非常简单,您不需要这样做。在Ent
模型中,定义以下内容:
public function scopeFilter($query, $filters)
{
if( isset($filters['type']) ){
$query->where('type', '=', $filters['type']);
}
// keep going for all of your filters
}
在您的Controller索引方法中,您可以:
public function index()
{
$entries = \App\Ent::filter(['type', 'customer'])->get();
dd($entries);
}
修改强>
为了帮助您更好地理解这一点,请在数据库的Ent
列上过滤type
。
路线:
Route::get('/ent', 'EntController@index');
Ent Model:
class Ent extends Model
{
public function scopeFilter($query, $filters)
{
if( isset($filters['type']) ){
$query->where('type', '=', $filters['type']);
}
}
}
Ent Controller:
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>
所以现在,如果我要进入那种形式并输入“Foo Bar&#39;并点击提交,你会得到在SQL
中看起来像这样的东西 SELECT * FROM Ent WHERE type='foo bar'
或换句话说,所有Ent
与type
列=
&#39; foo bar&#39;。
当我向用户提供输入原始文本以进行过滤的功能时,我希望向他们提供疑问,并使用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" />