2016-12-13 5 views
0

У меня есть следующие 3 таблицы, которые нормированы: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 фильм имеет несколько жанров, и жанр имеет несколько фильмов.

Я создал модели 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 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 

Но я не знаю, как превратить этот запрос в стиле красноречив, и да я могу сделать необработанный запрос в красноречивы, но я хочу, чтобы использовать отношения создали.

Пожалуйста, дайте мне совет.

ответ

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

Update

Предполагая, что вы есть:

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

Примечание - я не проверял, но вы можете дать ему попробовать.

+0

Есть ли способ сделать это, используя 1 запрос, такой как версия mysql? – Coder

+0

Ваш запрос работает нормально, но он ищет не менее 1 ошибки, в моем случае мне нужно как минимум 2. – Coder

+0

Пожалуйста, проверьте обновленный ответ. –

Смежные вопросы