用于过滤的Laravel资源控制器
我有一个API的用于过滤的Laravel资源控制器,laravel,Laravel,我有一个API的资源控制器,我正在开发该控制器,用于显示可通过类型和客户过滤的记录,我有以下方法可以获取此数据: 索引 show->需要一个参数(id) 因此,我是否可以在索引方法中放入请求,以过滤所有条目,或者这样做是不好的做法?我的代码如下所示: public function index() { $entries = \App\Ent::where(function($en) { $request = app()->make
资源
控制器,我正在开发该控制器,用于显示可通过类型
和客户
过滤的记录,我有以下方法可以获取此数据:
索引
show
->需要一个参数(id)
因此,我是否可以在索引
方法中放入请求
,以过滤所有条目,或者这样做是不好的做法?我的代码如下所示:
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);
}
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);
}
编辑
为了帮助您更好地理解这一点,让我们在数据库的type
列中筛选Ent
路线:
Route::get('/ent', 'EntController@index');
耳鼻喉科型号:
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>
这里需要注意的另一件事是,过滤器[name]
是
字段的名称,而不是数据库中列的名称。您的目标是$query
扩展中的列,而不是$filters
数组中的列。请参见以下示例:
if( isset($filters["ent_type"] ){
$query->where('type', '=', $filters["ent_type"]);
}
在我的表格上是
<input name="ent_type" type="text" />
非常感谢。类型
,客户
是变量,而不是被筛选对象的实际名称吗?因为这些将通过URL传递。。像?type=Car&
当前输出的dd($filters['type']
将只显示type
我想要实际值的地方是,$filter[name]
如果GET
或POST
变量的名称。然后在acutal查询修饰符中,您以DB列为目标。但是这没有意义。$request->GET('type');//=“Testing”
因此:::过滤器([$request->GET('type'),'customer')->GET()
值将是Testing
,这意味着在模型内部,if语句永远不会被触发?不要在过滤器内部使用$request->get('type')
只需使用我的代码,过滤器(['type','customer'])
.Laravel magic已经假定在filter中传递到该数组的所有内容都是POST或GET变量。我必须将控制器索引方法从Ent::filter(['type','customer'])修改为Ent::filter($request->all()),才能使其起作用。@7月12日19:29的Phorce评论是正确的,只传递了$\u GET名称,而不是值。
<input name="ent_type" type="text" />