Tengo un pequeño problema, tengo una mesa con Películas y otra con Géneros ej: Acción, Aventura etc ...

Nombres de tablas:

  • películas
  • género de película
  • géneros

Quiero buscar todas las películas con el género seleccionado, p. Ej .: Acción

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

Este código php no funciona, ¿cómo puedo hacerlo funcionar?

PD: $ _GET ['género'] transfiere el género de la vista y se almacena en la variable $ género.

Edite después de la respuesta de @Shane y @Marcin Nabiałek:

La relación se establece en los modelos y cuando uso su código directamente así:

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);

Funciona perfectamente, pero con la función when () no funciona. Tengo que usar when() para que la condición funcione solo si hay un género seleccionado por el usuario.

0
Chidox 13 nov. 2017 a las 22:02

2 respuestas

La mejor respuesta

Debes usar whereHas para obtener todas las películas asignadas a un género determinado:

$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);

En caso de que $ genre sea solo id y no modelo, debería usar:

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

Y en caso de que sea una matriz (el usuario puede elegir varios géneros), debe usar:

 return $query->whereIn('id', (array) $genre);
0
Marcin Nabiałek 13 nov. 2017 a las 20:19

No estoy familiarizado con la función when. Yo uso whereHas:

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

Además, ¿$genre es el modelo o la identificación? Mencionaste que fue recibido de $_GET lo que significaría que probablemente sería una identificación.

Creo que una mejor solución sería usar su función de relación en el modelo Genre para obtenerlos:

$movies = Genre::find($genre_id)->movies;
0
Shane 13 nov. 2017 a las 19:34