2012-12-29 3 views
0

Laravel 프레임 워크를 사용하여 쿼리에 대한 도움이 필요합니다. 나는 사용자 등급을 incude 몇 열로 사용자 명단을 짓고 있어요. 기본적으로 이니셜이있는 모든 활성 사용자를 선택하고 각 사용자에 대한 등급을 선택하기 위해 사용자 등급 테이블을 조인합니다. where_in은 특정 등급 만 선택하는 것입니다. 내 문제는 명단에 있으며 사용자가 둘 이상의 평점을 갖고있는 경우에만 모든 등급이 아니라 한 등급을 선택합니다. 또한 group_by없이 시도했지만 사용자가 보유한 평점의 수에 따라 테이블에 사용자가 중복됩니다 (예 : 사용자의 평점이 2 인 경우 행이 로스터에 두 번 표시됨).사용자 명단, 테이블에 합류했지만 데이터가 손실 됨

검색어 :

$users = DB::table('users') 
    ->where('users.initials', '!=', '') 
    ->left_join('user_ratings', 'user_ratings.uid', '=', 'users.uid') 
    ->where_in('users_ratings.rid', array(6,17,21,20)) 
    ->group_by('users.uid') 
    ->order_by('users.name') 
    ->get(); 

테이블 :

the documentation 얼핏가 유창함 쿼리 빌더는 MySQL이 할 수있는 일을 할 수 있고, MySQL은 클라이언트에 배열을 반환 할 수없는 것을 알 수
Users 
    ======= 
    uid name 
    1  John 
    2  Jeff 
    3  Cathy 

    Ratings 
    ====== 
    rid uid 
    1  1 
    2  1 
    2  2 
    3  1 
    4  3 

답변

3

문제는 left_join을 할 때 얻을 결과가 여러 행이라는 것입니다. 따라서 group_by 절을 사용하지 않으면 열이 아닌 행에 필요한 모든 결과가 반환되고 group_by를 사용하면 첫 번째 등급 (예상되는 동작) 만 반환됩니다.

저는 Eloquent ORM을 사용하고 모델과 그 관계를 설정하는 것이 좋습니다 (훨씬 쉽고 간단합니다). user_rating이 many-to-many 피벗 테이블 인 것 같습니까? 어떤 경우에 당신은 두 가지 모델의 User and Rating을 가질 것이고 그들의 관계는 has_many_and_belongs_to가 될 것입니다. 또한 laravel의 명명 규칙은 피벗 테이블이 알파벳순으로 정렬되어 있으므로 "rating_user"라고합니다. 관계를 설정하는 방법은 여기를 봐 그들의 관계 모델 일단 http://laravel.com/docs/database/eloquent#relationships

입니다 설정은, 내가 무엇을 할 것입니다 것은 다음

$users = User::where('initials', '!=', '')->order_by('name')->get();

,

foreach($users as $user) { 
    echo "Ratings for " .$user->name . ": "; 
    $ratings = $user->ratings()->pivot()->where_in('rid', array(6,17,21,20))->get(); 
    foreach($ratings as $rating) { 
     however you want to display the ratings here... 
    } 
} 

이되지 않을 수도 있습니다 가장 효율적인 방법이지만 내 가정이 사실이라면 주어진 일을 끝내야합니다.

관련 문제