2017-05-03 4 views
1

하위 쿼리를 사용하여 단일 게시물을 반환하려고합니다. 아래쪽 투표 수와 상위 투표 수를 포함시킵니다. 원시 쿼리를 사용하여이 작업을 수행 할 수 있습니다.Laravel 원시 쿼리 및 모델 관계 포함

그러나 이렇게하면 모델 모델 관계에 더 이상 액세스 할 수 없습니다. 코멘트.

모델 관계를 유지하기 위해 내가 할 수있는 Eloquent 방법이 더 있습니까?

아니면 내가 모든 일에 대해 할 수있는 더 좋은 방법이 있습니까? 당신이 그것에 대해 어떻게 생각하는지 듣고 싶습니다.

$post = DB::select(
     "SELECT post.*, 
     (SELECT COUNT(*) FROM posts_votes 
     WHERE type = 1 
     AND post_id = posts.id) 
     AS up_votes, 
     (SELECT COUNT(*) FROM posts_votes 
     WHERE type = 2 
     AND post_id = posts.id) 
     AS down_votes 
     FROM posts 
     INNER JOIN posts_votes ON posts.id = posts_votes.post_id 
     WHERE posts.id = ?", [$id])[0]; 
+0

사용 '게시물 :: setect' 시도 -' –

+1

당신이 포스트 :: 원시와 같은 웅변 모델 원시 사용할 수 있습니다 ({}) 함수 ($ 하위 쿼리)> 어디 ("sql query") -> with ("relation") –

답변

1

`이

Post::select('*') 
->addSelect(DB::raw(' 
    (select count(*) 
    from posts_votes 
    where type = 1 
    and post_id = posts.id) 
    as up_votes 
')) 
->addSelect(DB::raw(' 
    (select count(*) 
    from posts_votes 
    where type = 2 
    and post_id = posts.id) 
    as down_votes 
')) 
->whereIn('id', $ids) 
->get(); 
+0

이것은 잘 작동했습니다. @DivyankMunjapara가 주석을 달았 기 때문에 방금 질의 끝에 '-> ('관계 ')를 추가 할 수있었습니다. 그러나 나는이 방법이 더 추상적 인 것처럼 느낀다. 필자가 변경해야 할 것은'whereIn()'에서'where'까지였습니다. – patskot

+0

Ive는 당신을 위해 하나를 가지고 있습니다 (어쩌면 다른 질문을 열어야합니까?). 위의 예제를 사용하여'posts_votes' 카운트를'$ posts-> children()'에 적용하는 방법은 무엇입니까? – patskot

+1

@patskot u는 모든 선택을 자식에 추가 할 수 있습니다. $ posts-> children() -> select ($ all) -> addSelect ($ upvotesquery) -> addSelect ($ downvotequery) -> get(). 이 경우 게시물 모델에 범위를 만듭니다. scopeUpDownVotes() (예 : –