Laravel (5.3) Красноречивый – проблема отношений

У меня есть следующие 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 

Как вы можете видеть в третьей таблице, фильм имеет несколько жанров, а жанр имеет несколько фильмов.

Я создал модели TheMovies и TheGenres в laravel.

Я убедился, что отношения сделаны внутри моделей, используя следующий код:

 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, основанного на другой таблице .

 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 style, и да, я могу сделать необработанный запрос в 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(); 

Примечание. Я не тестировал его, но вы можете попробовать.