【问题标题】:Laravel (5.3) Eloquent - Relationship issueLaravel (5.3) Eloquent - 关系问题
【发布时间】:2017-04-28 16:20:56
【问题描述】:

我有以下 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

正如您在第三张表中看到的那样,一部电影有多种类型,而一种类型有多种电影。

我在 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 类似,它们都是动作和冒险,如您在第三张表中所见。

我根据以下帖子找到了所需的查询: 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 中进行原始查询,但我想利用创建的关系。

请给我一些建议。

【问题讨论】:

    标签: php mysql laravel laravel-5


    【解决方案1】:

    你可以试试:

    // 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();
    

    注意 - 我没有测试过,但你可以试一试。

    【讨论】:

    • 有没有办法像mysql版本一样使用1个查询来做到这一点?
    • 您的查询运行良好,但它搜索至少 1 次,在我的情况下我需要至少 2 次。
    • 非常感谢@iCode
    猜你喜欢
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2016-09-20
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2021-06-19
    相关资源
    最近更新 更多