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" />
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
Ja, die $ filter [name ] 'wenn der Name der' GET' oder 'POST' Variablen. Dann zielen Sie im acutal Query Modifier auf Ihre Datenbankspalte. –
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