2017-10-01 1 views
2

그래서 을 포함하는 Subject이 있는데, 여기에는 Question이 포함되어 있습니다. 모든 질문마다 답이 있습니다. 답변을 모두 Stack에 포함 시키려고합니다.하지만 막혀 있습니다. 열정적으로로드 된 관계에서의 반환 횟수 Laravel

내가 많은 솔루션 중 하나는 내가 만지작되었습니다 할 노력하고있어 무엇 :

$subjects = Subject::with(['stack.question', 'stack.answersCount'])->get(); 

    return $subjects; 

Subject 모델은 다음과 관련이있다 : 우리가 보면

public function stack(){ 
    return $this->hasMany(Stack::class); 
} 

을 그리고 그 관계가 어떻게 형성되는지에 관한 모델 :

public function question(){ 
    return $this->hasMany(Question::class); 
} 

public function answers(){ 
    return $this->hasMany(Answers::class); 
} 

public function answersCount(){ 
    return $this->answers()->selectRaw('answer, count(*) as aggregate')->groupBy('answer'); 
} 

하지만 return $subjects 일 때 answer_count이 비어 있습니다.

"answers_count": [] 

SQL에서 동일한 쿼리를 실행할 때 비어있는 결과가 나오기 때문에 매우 혼란 스럽습니다.

어떻게 모든 대답을 계산할 수 있습니까? 그룹으로 묶어?

답변

0

이 방법을 시도

$subjects = Subject::with(['stack.question', 'stack.answersCount'])->get(); 
$count = $subjects->answersCount->first()->aggregate; 

//count varible will have the count now you can use it as you would like to 

return $subjects; 

또한 굴착은

+0

로 보인다 대안이지만, 어떻게 든 설명했듯이 카운트를 가져올 수 있습니까? 그것은 그것을하는 아주 청결한 방법 같이 보인다. 그리고 왜 그것이 작동하지 않는지 나는 이해할 수 없다. – Adam

+0

나는 그것을 잘 보았을 필요가있다. –

+1

예 테스트를 마쳤습니다. 이제 블레이드 파일에서이 개념을 사용하고 있지만, 이것은 n + 1 문제입니다. 이것은 웅변적인 버그입니까? – Adam

0

hereanswersCount 관계를 제거 찾을 수 있습니다 - 당신이 withCount 방법을 사용할 수 있기 때문에 그것은 더 이상 필요는 없습니다 :

$subjects = Subject::with([ 
    'stack.question', 
    'stack' => function ($q) { 
     $q->withCount('answers'); 
    } 
])->get(); 

// then on each subject you can call stack->answers_count 
$subjects->first()->stack->answers_count 
+0

네, 좋은 해결책이지만, 불행히도 나는'correct'와'wrong'에서 카운트를 그룹화하고 싶습니다. – Adam

+0

2 개의 적절한 릴레이션을 만들고 두 경우 모두 withCount를 호출하십시오. –

+0

그 순간에 제가 한 것은 바로 스택 모델에서'wrongAnswer()'와'correctAnswer()'입니다. 그리고 나는 withCount()를 호출 할 수 있고 특정 사용자를 움켜 잡기 위해'where'를 붙일 수 있습니다. – Adam