2017-07-12 8 views
1

Ich habe einen resource Controller für eine API, die ich für die Anzeige von Datensätzen bin zu entwickeln, die durch Type und Customer gefiltert werden kann, und ich habe die folgenden Methoden, die diese Daten erhalten können:Laravel Ressourcensteuerung zum Filtern

index

show -> erfordert eine parameter (id)

Kann ich deshalb eine request innerhalb des index Methode setzen für alle Einträge Filterung zurück oder ist es b ad Praxis dafür? Mein Code sieht wie folgt aus:

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); 
    } 

Antwort

1

Filtering in Laravel ist sehr einfach und Sie müssen nicht, dies zu tun. In Ihrem Ent Modell, definieren Sie die folgenden Schritte aus:

public function scopeFilter($query, $filters) 
    { 
    if(isset($filters['type'])){ 
     $query->where('type', '=', $filters['type']); 
    } 
    // keep going for all of your filters 
    } 

Und auf Ihre Methode Controller-Index können Sie:

public function index() 
{ 
    $entries = \App\Ent::filter(['type', 'customer'])->get(); 
    dd($entries); 
} 

EDIT

Sie mehr Gefühl für diese optimal nutzen zu können, lassen Sie uns Filter Ent auf der Spalte type in der Datenbank.

Route:

Route::get('/ent', '[email protected]'); 

Ent Modell:

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')); 
    } 
} 

ist aus Gründen des dieses Beispiels Lassen Sie sagen, werden uns nur auf eine Form gebracht die gleiche Blade-Vorlage geben wir unsere Liste aus:

@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> 

So, jetzt, wenn ich in dieser Form und Art ‚Foo Bar‘ und senden Sie treffen gehen, würden Sie bekommen, was so etwas wie dies in SQL

SELECT * FROM Ent WHERE type='foo bar'

Oder mit anderen Worten aussehen würde , alle Ent mit der type Spalte = 'foo bar'.

Wenn ich einem Benutzer die Möglichkeit gebe, Rohtext in den Filter einzugeben, gebe ich ihm den Vorteil des Zweifels und verwende LIKE anstelle von =. So zum Beispiel, würden wir nur unsere scopeFilter Methode ändern:

if(isset($filters['type'])){ 
    $query->where('type', 'LIKE', '%' . $filters['type'] . '%'); 
} 

Eine andere Sache, hier zu beachten, ist die filters[name] der Name des <input> Feldes, nicht der Name der Spalte in Ihrer Datenbank. Sie zielen auf die Spalte in der $query Erweiterung, NICHT in der $filters-Array.Siehe unten Beispiel:

if(isset($filters["ent_type"]){ 
$query->where('type', '=', $filters["ent_type"]); 
} 

Auf meinem Formular, das

<input name="ent_type" type="text" /> 
+0

Großer Dank wäre. Sind 'type',' customer' Variablen und nicht die tatsächlichen Namen der Dinge, die gefiltert werden? Da diese über URL übergeben werden .. wie '? Type = Car &' Derzeit Ausgabe 'dd ($ filters ['type']' wird nur 'type 'zeigen, wo ich den tatsächlichen Wert – Phorce

+0

Ja, die $ filter [name ] 'wenn der Name der' GET' oder 'POST' Variablen. Dann zielen Sie im acutal Query Modifier auf Ihre Datenbankspalte. –

+0

Es macht keinen Sinn obwohl ..' $ request-> get ('type');// = "Testing" also also: ':: filter ([$ request-> get ('type'), 'customer']) -> get();' Der Wert wäre 'Testing', was im Modell bedeutet , die if-Anweisung wird niemals ausgelöst? – Phorce

Verwandte Themen