2017-07-12 163 views
1

我有一个resource控制器,我正在开发用于显示可以通过TypeCustomer被过滤记录的API和我有以下几种方法,可以得到这样的数据:Laravel资源控制器用于过滤

index

show - >需要一个parameter (id)

能否因此把requestindex方法内,用于过滤的所有条目的背面或是过b广告的做法呢?我的代码如下所示:

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

在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'

或者换句话说,全部Enttype='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" /> 
+0

十分感谢。是“type”,“customer”变量而不是被过滤的东西的实际名称?因为这些将通过网址传递。就像'?type = Car&'正在输出'dd($ filters ['type']''会显示'type',我想要实际的值 – Phorce

+0

是的,'$ filter [name ]''GET''或'POST'变量的名称,然后在acutal查询修饰符中,你的目标是你的DB列 –

+0

尽管''request-> get('type');/=“Testing”'so so:':: filter([$ request-> get('type'),'customer']) - > get();'这个值就是'Testing',它意味着模型,if语句永远不会被触发? – Phorce