2017-04-09 4 views
1

Ich erstelle eine Suche in Laravel für eine API, aber meine Suche gibt mir die falschen Ergebnisse. Ich versuche nach Ort und Art zu suchen. Ich habe die folgenden Tabellen:Filterung Ergebnis mit eifrig laden

  1. Lebensmittel
  2. Geschäfte
  3. shop_food
  4. Benutzer
  5. Kommentare

Hier ist mein Suchcode:

public function searchShop($food, $location) 
{ 
    // 
    if($food == " " || $location == " "){ 
     return $this->index(); 
    } 

    //get all records where city and food are equal to 
    $shops = Shop::where('city', '=', $location) 
     ->with('comments.user') 
     ->with(['foods'=> function($query) use($food){ 
       $query->where('name','=', 'fish pepper'); }]) 
     ->get(); 

     //check if empty and return all 
     if($shops->isEmpty()){ 
      return $this->index(); 
     } 

    return $shops; 
} 

mein Ergebnis ist die unten anstatt nur den Datensatz wo Lage und Essen sie alle Geschäfte nach Standort gefiltert zeigt auch, wo Essen ein Spiel ist nicht: enter image description here

Antwort

0

Die with Methode, die Sie verwenden Filter nicht in der Art und Weise, Du denkst es tut es. Ihr Code filtert tatsächlich die Nahrungsmittelergebnisse und sagt Eloquent, alle Shop und entweder keine Nahrungsmittel oder die Nahrungsmittel mit dem Namen fish pepper zurückzuholen. Dies wird als einschränkende, eifrige Lasten bezeichnet.

Die Methode, nach der Sie suchen, ist whereHas statt with. Dies wird als Abfragen eines Beziehungsdaseins bezeichnet.

$shops = Shop::where('city', '=', $location) 
    ->with('comments.user') 
    ->whereHas('foods', function($query) use($food){ 
     $query->where('name','=', 'fish pepper'); 
    }) 
    ->get(); 

zurückkehren Dies wird nun nur Shop s, die einen entsprechenden Lebensmittel Eintrag mit dem Namen fish pepper haben.

Wenn der Speicher dient, wird whereHas nicht wirklich foods für Sie bevölkern, aber in diesem Fall würden Sie es nicht brauchen, wie es ist sicher anzunehmen, dass sie alle fish pepper haben. Wenn Sie alle Lebensmittel ziehen möchten, ändern Sie with('comments.user') zu with(['comments.user', 'foods']).

Dokumentation für whereHas und andere Möglichkeiten, dies zu erreichen, finden Sie here.

Dokumentation über das, was Sie mit der with Methode gemacht haben, finden Sie here.

Hoffe, dass hilft.