Laravel(5.3)Eloquent - 关系问题

时间:2016-12-13 14:47:35

标签: php mysql laravel laravel-5

我有以下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中创建原始查询,但我想利用所创建的关系。

请给我一些建议。

1 个答案:

答案 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();

注意 - 我没有测试过,但您可以尝试一下。