Laravel 5.2 多对多查询与 where 子句的关系
Laravel 5.2 Many to Many query relationship with where clause
我有一个小问题,我有一部 table 电影 电影 和另一部 流派 例如:动作片、冒险片等...
Table 姓名:
- 电影
- movie_genre
- 流派
我想获取所选类型的所有电影,例如:动作片
$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);
我有一个小问题,我有一部 table 电影 电影 和另一部 流派 例如:动作片、冒险片等...
Table 姓名:
- 电影
- movie_genre
- 流派
我想获取所选类型的所有电影,例如:动作片
$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);