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

时间:2017-11-13 19:02:40

标签: php laravel-5 eloquent laravel-5.2

我有一点问题,我有一张电影的表格,另一张有类型的表格:动作,冒险等......

表名:

  • MOVIE_GENRE
  • 流派

我想用所选的Genre ex获取所有电影:动作

$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和@MarcinNabiał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()仅在用户选择了类型时才使条件有效。

2 个答案:

答案 0 :(得分:0)

我不熟悉when功能。我使用whereHas

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

此外,模型或ID是$genre吗?你提到它是从$_GET收到的,这意味着它可能是一个ID。

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

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

答案 1 :(得分:0)

您应该使用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);