2016-07-20 5 views
4

Ich habe einige API haben einfache Abfrage, die in URL erstellt werden kann. Zum Beispiel habe ich Produkttabelle mit Produktmodell.Laravel 5.2 Erstellen Abfrage mit URL Get Parameter zum Auswählen von Feldern, Zeichenfolge übereinstimmen und sortieren

Produkte Tabelleneigenschaften:

  • id
  • product_name
  • Barcode
  • category_id
  • Beschreibung
  • Preis

Wie ich que tun können ry in url wie unten (Felder Parameter bezeichnet die angegebenen Felder wählen):

http://example.com/product?fields=id,product_name,price,barcode&sortby=price

oder vielleicht wie diese zu erhalten Preis EqualTo 10.00:

http://example.com/product?fields=id,product_name,price,barcode&price=10.00

Ich weiß, in Laravel wir können Überprüfen Sie die Get-Parameter mit $request->has() und erhalten Sie den Wert mit $request->input('fieldname) zu überprüfen und den Wert eins nach dem anderen

Aber ich denke, dass es Shoul d ist eine bessere Möglichkeit, das zu tun, oder vielleicht gibt es eine Wrapper-Funktion, die für alle Controller verwendet werden kann, um die Abfrage von URL-Get-Parametern zu lesen.

Danke

Antwort

5

Ok, hier gehen wir. Ich werde versuchen, didaktisch zu sein.

TO

DO eine API bauen, die Datenbank zu suchen und liefert Produkte von auf URL-Parametern basieren.

Eigenschaften

Zunächst einmal haben wir ein Array mit unseren alle gültigen Eigenschaften.

$props = [ 
    'id', 
    'product_name', 
    'barcode', 
    'category_id', 
    'description', 
    'price' 
]; 

Parameter

Lassen Sie uns speichern alle Parameter, die von URL in einer Variablen kommt:

$parameters = Input::all(); 

Ohne Parameter

Wenn alle Parameter übergeben wurde, können wir wählen alle Produkte mit ihren Feldern und geben das Ergebnis zurück:

if (empty($parameters)) { 
    $products = Product::all(); 
    return $products; 
} 

Organisieren Dinge

wir bedenken, dass wir 3 "Kategorien" von Parametern haben:

  1. , dass die Felder bestimmt, ausgewählt (optional) werden.
  2. Das bestimmt die Ergebnisreihenfolge (optional).
  3. Das bestimmt die Suchklauseln (optional).

Identifizierung der Felder

Für die erste Kategorie, werden wir den fields Parameter verwenden, die durch Komma einen String trennt jedes Feld erhält.

$fieldsParam = $parameters['fields']; // Gets fields string. 
$fieldsParamSplit = explode(',', $fieldsParam); // Split the fields string into array. 
$fields = array_intersect($props, $fieldsParamSplit); // Gets only wanted fields. 

Die Reihenfolge

Für die zweite Kategorie, werden wir den sortby Parameter verwenden, die ein bestimmtes Feld (Eigenschaft) Namen erhält.

$orderProp = null; 

// Check if parameter "sortby" exists and if it is valid. 
if (isset($parameters['sortby']) && in_array($parameters['sortby'], $props)) { 
    $orderProp = $parameters['sortby']; 
} 

Es gibt einige Klausel?

Für die dritte Kategorie verwenden wir alle Parameter (außer den oben genannten), um die where-Klauseln der Suche zu erstellen.

$clauses = []; 

foreach ($props as $prop) { 

    // Check if the current property is present in parameters.  
    if (in_array($prop, array_keys($parameters))) { 
    // Each item represents a where clause. 
    $clauses[$prop] = $parameters[$prop]; 
    } 
} 

Aufbau der Sammlung

Nun, da alle paremeters validiert sind, können wir die Sammlung von Produkten aufbauen und das Ergebnis zurück.

if ($orderProp) { 
    $products = Product::where($clauses)->orderBy($orderProp)->get($fields); 
} else { 
    $products = Product::where($clauses)->get($fields);  
} 
return $products; 
+1

Sehr nett, Sir. Sie haben auch einen Validierungsteil für die 'Felder' mit' array_intersect' hinzugefügt. Hab das nie gedacht. Ich arbeite, bis auf den letzten Code, den ich ändern muss "if ($ orderProp)" ich nehme an.Danke sir – xmhafiz

+0

@ h44f33z oh ja, sicher –

+0

diese Zeile muss auch geändert werden, um 'array_keys' in' // zu verwenden. Überprüfen Sie, ob die aktuelle Eigenschaft in Parametern vorhanden ist. 'if (in_array ($ prop, array_keys ($ parameters))) '. Das ist es. Jetzt möchte ich auf Basis-Controller setzen, damit es wiederverwendet werden kann. Vielen Dank – xmhafiz