我有以下3个规范化的表格:
`Table: TheMovies`
id | MovieName
---------------------
1 | Zootopia
2 | Moana
3 | Toy Story
`Table: TheGenres`
id | GenreName
---------------------
21 | Action
22 | Animation
23 | Adventure
`Table: mMoviesGenres`
movieID | genreID
---------------------
1 | 21
1 | 23
2 | 22
2 | 21
3 | 23
3 | 21
正如你在第3张表中看到的那样,一部电影有多种类型,一种类型有多部电影。
我已经在laravel中创建了TheMovies和TheGenres模型。
我确保使用以下代码在模型内部建立关系:
class TheMovies extends Model
{
public function TheGenres() {
return $this->belongsToMany('App\TheGenres', 'mMoviesGenres', 'seriesID', 'genreID');
}
}
class TheGenres extends Model
{
public function TheGenres() {
return $this->belongsToMany('App\TheMovies', 'mMoviesGenres', 'genreID', 'seriesID');
}
}
我测试了所有内容,并且我成功显示了特定电影的类型列表,并且还成功显示了特定类型的电影列表。
实际问题是我想根据流派显示特定电影的相关电影。
让我们把TheMovies.id = 1与TheMovies.id = 3类似,它们都是Action和Adventure,你可以在第三个表中看到。
我已根据以下帖子找到了所需的查询: SQL Query based on other table
SELECT m2.movieId
FROM mMoviesGenres m1
INNER JOIN mMoviesGenres m2
ON m1.genreID = m2.genreID
WHERE m1.movieId = 1 AND
m2.movieId <> 1
GROUP BY m2.movieId
HAVING COUNT(*) >= 2
但我不知道如何以Eloquent风格转换此查询,是的我可以在Eloquent中创建原始查询,但我想利用所创建的关系。
请给我一些建议。
答案 0 :(得分:2)
您可以尝试:
// returns array of genre_ids associate with the TheMovies.id => 1
$genre_ids = TheGenres::whereHas('TheMovies', function($q) {
$q->where('id', 1);
})->pluck('id')->toArray();
然后使用这些$genre_ids
获取相关的电影:
TheMovies::whereHas('TheGenres', function($q) use($genre_ids) {
$q->whereIn('id', $genre_ids);
})->get();
<强>更新强>
假设你有:
$genre_ids = [21, 23];
然后您的查询可以是:
TheMovies::whereHas('TheGenres', function($q) use($genre_ids) {
$q->whereIn('genreID', $genre_ids)
->groupBy('movieID')
->havingRaw('COUNT(DISTINCT genreID) = 2');
})->get();
注意 - 我没有测试过,但您可以尝试一下。