2017-01-14 9 views
2

Ich möchte eine Liste von Produkten zu filtern. Die API ist in der Route/q zugänglich, ich übergebe die Filterparameter wie diese/q? Location = 1,2 & category = 1,2,3 (wenn keine Argumente übergeben werden, werden alle Standorte/Kategorien abgerufen.Filter Modelle durch mehrere Bedingungen in Laravel/Eloquent

.
public function getProductsByQuery() 
{ 
    $commaSeparatedLocations = Input::get('location'); 
    $commaSeparatedCategories = Input::get('category'); 


    if ($commaSeparatedLocations == null){ 
     $numberOfLocations = Location::count(); 
     for ($i=0;$i<=$numberOfLocations;$i++) 
     { 
      $locationsArray[$i] = $i; 
     } 
    } else { 
     $locationsArray = $this->toArray($commaSeparatedLocations); 
    } 

    if ($commaSeparatedCategories == null){ 
     $numberOfCategories = Category::count(); 
     for ($i=0;$i<=$numberOfCategories;$i++) 
     { 
      $categoriesArray[$i] = $i; 
     } 
    } else { 
     $categoriesArray = $this->toArray($commaSeparatedCategories); 
    } 

    return $products = Product::whereIn('category_id', $categoriesArray)->whereIn('location_id', $locationsArray)->paginate(config('app.products_per_page')); 
} 

public function toArray($commaSeparatedString) 
{ 
    return explode(",",$commaSeparatedString); 
} 

Und na ja, es funktioniert, aber ich frage mich, wie kann ich meinen Code verbessern muss eine intelligentere Art und Weise sein, wo nicht so viele SQL-Abfragen benötigt werden

Antwort

1

Das sieht viel besser lesbar zu mir:..

public function getProductsByQuery() 
{ 
    $q = Product::query(); 

    if (request('location')) { 
     $q->whereIn('location_id', $this->toArray(request('location'))); 
    } 

    if (request('category')) { 
     $q->whereIn('category_id', $this->toArray(request('category'))); 
    } 

    return $q->paginate(config('app.products_per_page')); 
} 
+1

ansehen. Das ist genial. Danke vielmals. –

+0

Es war so interessant, wo (oder wie) kann ich mehr Informationen dazu finden? Weil diese Methode query() nicht in der offiziellen Dokumentation enthalten ist. Danke noch einmal. –

+0

@JorgeAnzola Sie werden dies nicht in den Dokumenten finden, aber Sie können in den Quellcode schauen, um zu verstehen, wie es funktioniert. 'query()' ist eine Methode in der 'Model' Klasse, die nur eine neue Abfrage erzeugt. –