2016-12-13 3 views
0

I가 정규화 다음과 같은 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 표에서 볼 수 있으며, 장르는 여러 영화를 가지고있다.

나는 TheLove에서 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 

그러나 나는 웅변 스타일이 쿼리를 변환하는 방법을 모른다, 그래 나는 웅변에 원시 쿼리를 만들 수 있지만, 내가 만든 관계의 사용을 만들고 싶어.

제발 나에게 조언을 해줘.

답변

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

참고 :

는 다음 쿼리로 할 수있다.

+0

mysql 버전과 같은 1 개의 쿼리를 사용하는 방법이 있습니까? – Coder

+0

귀하의 질의 응답은 잘 작동하지만, 적어도 1 건의 검색이 제 경우에는 적어도 2가되어야합니다. – Coder

+0

업데이트 된 답변을 확인하십시오. –