질문을 삭제하지 말아주세요.!
 
1
0
-1

안녕하세요. 라라벨 공부중인 학생입니다!

리뷰 순서로 정렬 한 뒤 출력하고 싶은데 sql 쿼리는

SELECT COUNT(re.user_id) AS 'Cnt_user_id'
FROM users u
INNER JOIN reviews re ON u.id = re.user_id
GROUP BY re.user_id
ORDER BY Cnt_user_id DESC;

 입니다!

이걸 라라벨에

$reviewsSort = User::select(DB::raw('COUNT(*) AS count_user_id'))
->join('reviews', DB::raw('reviews.user_id'), '=', 'users.id->user_id')
->groupBy('reviews.user_id')
->orderBy('count_user_id', 'desc')
→get();

하였는데 결과가 나오지 않습니다.

혹시 위 쿼리문을 라라벨에 옮기는 방법이 있는지 궁금합니다! 스오플에 찾아보니 저렇게 하래서 했는데 안되네요..ㅠ

    CommentAdd your comment...

    2 answers

    1.  
      1
      0
      -1

      쿼리 내용을 보면 댓글을 작성한 사용자의 수를 구하는 것인 것 같네요

      User 와 review 의 관계는 one to many 관계이기 때문에 

      $count = Review::select(‘user_id’)->distinct(‘user_id’)→count('user_id');

      distinct 로 중복을 제거하고 마지막에  user_id 의 갯수만 구함

      요렇게 하면 댓글을 1회 이상 작성한 사용자의 총 수를 구할수가 있겠네요.

      이렇게 하기 위해서는 Model 에 관계를 정의해 주어야 하는데요.

      //User 모델

      class User extends Model

      {

          public function Reviews()

          {

              return $this->hasMany(Review::class); //한명의 유저는 여러개의 댓글이 작성 가능 하므로


          }

      }

      //Review 모델

      class Review extends Model

      public function User()

      {

      return $this→hasOne(Review:class); //댓글은 오직 한명의 유저에 의해 작성 되므로

          }

      }

      만약 사용자 유저별 리뷰합 순으로 출력 하려면 아래와 같이 하면 될것 같습니다.

      Review::selectRaw('user_id , count(user_id) as Cnt_user_id')
      ->groupBy('user_id')
      ->orderByDesc(DB::raw('count(user_id)'))
      ->get();



      1. 정창현

         모델부분은 제대로 확인했습니다.

        whereHas()부분에 오류가 발생하여 확인을 하고 수정 해보겠습니다!! 기존에 발생하던 오류가 아닌 다른 오류를 발견해서 괜히 설레네요..ㅎㅎㅎ 감사합니다!

      2. dangtong

        whereHas 는 없어도 되네요

      3. 정창현

        넵! 감사합니다!

      CommentAdd your comment...
    2.  
      1
      0
      -1

      ORM으로 실행되는 쿼리를 확인해보셨나요?

      쿼리빌더에서 toSql() 메서드를 이용하시면 ORM에서 실행되는 쿼리를 확인 가능하십니다.


      해당 쿼리가 원하시는데로 작성되는지 확인해보세요.

      toSql
      1. 정창현

        쿼리빌더에서 toSql() 매서드를 이용한다는게 무슨 뜻인지 이해가 안됩니다ㅠㅠㅠ 한국엔 라라벨 자료가 한정되어 있더라고요ㅋㅋㅋ 한글 공식 사이트를 주로 참고하다보니 모르는게 많네요ㅠㅠ

      2. 권윤학
        $reviewsSort = User::select(DB::raw('COUNT(*) AS count_user_id'))
        ->join('reviews', DB::raw('reviews.user_id'), '=', 'users.id->user_id')
        ->groupBy('reviews.user_id')
        ->orderBy('count_user_id', 'desc')
        →get();
        
        //대신
        $sql = User::select(DB::raw('COUNT(*) AS count_user_id'))
        ->join('reviews', DB::raw('reviews.user_id'), '=', 'users.id->user_id')
        ->groupBy('reviews.user_id')
        ->orderBy('count_user_id', 'desc')
        →toSql();
        
        
        dd($sql);

        로 쿼리가 어떻게 생성되는지 확인해보세요.

      3. 정창현

        아...!!!!! 감사합니다. 한번 해보겠습니다!!


      CommentAdd your comment...