Laravel 5.2 多对多查询与 where 子句的关系

Laravel 5.2 Many to Many query relationship with where clause

我有一个小问题,我有一部 table 电影 电影 和另一部 流派 例如:动作片、冒险片等...

Table 姓名:

我想获取所选类型的所有电影,例如:动作片

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

这个 php 代码不起作用,我怎样才能让它起作用?

PS: 通过 $_GET['genre'] 从视图中传输类型并存储在变量 $genre 中。

在@Shane 和@Marcin Nabiałek 的回答后编辑:

关系是在模型中设置的,当我像这样直接使用你的代码时:

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

它工作得很好,但使用 when() 函数时却不行。我必须使用 when() 使条件仅在用户选择了一种类型时才有效。

我不熟悉 when 函数。我使用 whereHas

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

另外,$genre是型号还是ID?您提到它是从 $_GET 收到的,这意味着它可能是一个 ID。

我认为更好的解决方案是使用 Genre 模型中的关系函数来获取它们:

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

您应该使用 whereHas 获取指定类型的所有电影:

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

如果 $genre 只是 id 而不是 model,您应该使用:

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

如果它是一个数组(允许用户选择多个流派),您应该使用:

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