用于过滤的Laravel资源控制器

时间:2017-07-12 13:21:59

标签: laravel

我有一个resource控制器用于我正在开发的用于显示可以通过TypeCustomer过滤的记录的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);
    }

1 个答案:

答案 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'

或换句话说,所有Enttype=&#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" />