Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于过滤的Laravel资源控制器_Laravel - Fatal编程技术网

用于过滤的Laravel资源控制器

用于过滤的Laravel资源控制器,laravel,Laravel,我有一个API的资源控制器,我正在开发该控制器,用于显示可通过类型和客户过滤的记录,我有以下方法可以获取此数据: 索引 show->需要一个参数(id) 因此,我是否可以在索引方法中放入请求,以过滤所有条目,或者这样做是不好的做法?我的代码如下所示: public function index() { $entries = \App\Ent::where(function($en) { $request = app()->make

我有一个API的
资源
控制器,我正在开发该控制器,用于显示可通过
类型
客户
过滤的记录,我有以下方法可以获取此数据:

索引

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" />