我有一点问题,我有一张电影的表格,另一张有类型的表格:动作,冒险等......
表名:
我想用所选的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()
仅在用户选择了类型时才使条件有效。
答案 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);