2017-11-13 1 views
0

ich ein kleines Problem habe, habe ich eine Tabelle mit Filme und ein weiteres mit Genres ab: Action, Abenteuer etc ...Laravel 5.2 Viele zu viele Abfrage Beziehung mit where-Klausel

Tabellennamen:

  • Filme
  • movie_genre
  • Genres

ich alle Filme mit dem ausgewählten Genre ex holen will: Aktion

$movies = Movie::with('genres') 
      ->when($genre, function ($query) use ($genre) { 
         return $query->where('genres.id', $genre->id); 
        }) 
      ->paginate(20); 

Dieser PHP-Code funktioniert nicht, wie kann ich es funktioniert?

PS: Das Genre wird aus der Ansicht nach $ _GET ['genre'] übertragen und in der Variable $ genre abgelegt.

Bearbeiten nach der Antwort von @Shane und @Marcin Nabiałek:

Die Beziehung in den Modellen gesetzt ist und wenn ich Ihren Code direkt wie folgt aus:

Movie::with('genres', 'countries', 'type') 
      ->when($type, function ($query) use ($type) { 
         return $query->where('medias.type_id', $type->id); 
        }) 
      ->whereHas('genres', function ($query) use ($genre) { 
       return $query->where('genres.id', $genre->id); 
       }) 
      ->paginate(20); 

es Arbeit perfekt, aber mit der when() Funktion nicht. Ich muss die when() verwenden, um die Bedingung nur funktionieren zu lassen, wenn ein Genre vom Benutzer ausgewählt wurde.

+0

Sind Sie mehrere Werte in '$ _GET [ 'Genre']' oder einzelnen Wert zu bekommen? –

+0

Versuchen Sie 'whereHas': https://laravel.com/docs/5.2/eloquent-relationships#querying-relations – Shane

+0

Ich bekomme nur einen Wert mit dem' $ _GET ['genre'] ''. das 'whereHas' funktioniert perfekt, aber nicht mit dem' when() 'und ich verwende es, um die Bedingung nur dann zu bearbeiten, wenn ein Genre vom Benutzer ausgewählt wurde. – Chidox

Antwort

0

Sie sollten whereHas verwenden, um alle Filme zu erhalten, die zu bestimmten Genre zugeordnet sind:

$movies = Movie::with('genres') 
      ->when($genre, function ($query) use ($genre) { 
        $query->whereHas('genres', function($q) use ($genre) { 
        return $query->where('id', $genre->id); 
        });         
      })->paginate(20); 

Bei Genre $ ist nur id und nicht Modell, sollten Sie lieber verwenden:

return $query->where('id', $genre); 

und es ist ein Array (Benutzer erlaubt wird, mehrere Genres zu wählen) für den Fall, sollten Sie verwenden:

return $query->whereIn('id', (array) $genre); 
+0

Wenn ich Ihren Code ohne das '-> when()' verwende und es direkt so verwende: '$ films = Film :: mit ('Genres', 'Länder', 'Typ') -> wann ($ type, function ($ query) use ($ type) { zurückgeben $ query-> where ('medias.type_id', $ type-> id); }) > whereHas ('genres', function ($ query verwenden) ($ genre) { return $ query-> where ('genres.id', $ genre-> id); }) -> Paginieren (20); ' es perfekt funktionieren, aber mit dem, wenn() Funktion ist es nicht – Chidox

0

Ich bin nicht vertraut mit der when Funktion. Ich benutze whereHas:

$movies = Movie::whereHas('genres', function ($query) use ($genre) { 
    $query->where('id', $genre->id); 
})->with('genres')->get(); 

Auch ist $genre das Modell oder die ID? Du hast erwähnt, dass es von $_GET empfangen wurde, was bedeuten würde, dass es wahrscheinlich eine ID wäre.

Ich denke, eine bessere Lösung wäre, um Ihre Beziehung Funktion zu verwenden, in dem Genre Modell, sie zu erhalten:

$movies = Genre::find($genre_id)->movies; 
+0

$ genre ist das Modell, weil ich die ID aus der Datenbank hole und in der Variable $ genre ablege. – Chidox

+0

@Chidox Ich würde das zweite Beispiel verwenden. Ersetzen Sie '$ genre_id' durch' $ genre-> id'. Sie müssen nur sicherstellen, dass die Beziehung im 'Genre'-Modell eingerichtet ist:' public function movies() {return $ this-> belongsToMany ('App \ Movie'); } ' – Shane

+0

Die Beziehung ist in den Modellen festgelegt und wenn ich Ihren Code direkt wie folgt verwenden: $ filme = Film :: mit ('Genres', 'Länder', 'Typ') -> wann ($ Typ, Funktion ($ query) use ($ type) {return $ query-> wo ('medias.type_id', $ type-> id);})> whereHas ('genres', funktion ($ query) benutze ($ genre) {return $ query-> wo ('genres.id', $ genre-> id);}) -> paginate (20); es funktioniert perfekt, aber mit der Funktion when() funktioniert es nicht. Ich muss das 'when()' verwenden, um die Bedingung nur dann zu bearbeiten, wenn ein Genre vom Benutzer ausgewählt wurde. – Chidox