gpt4 book ai didi

php - Laravel (5.3) Eloquent - 关系问题

转载 作者:行者123 更新时间:2023-11-29 07:07:26 25 4
gpt4 key购买 nike

我有以下 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 类似,它们都是 Action 和冒险,正如您在第三个表中看到的那样。

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

请给我一些建议。

最佳答案

您可以尝试:

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

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

关于php - Laravel (5.3) Eloquent - 关系问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41123931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com