2017-10-01 19 views
2

だから私はSubjectStackで、これにはQuestionが含まれています。すべての質問には答えがあり、答えはすべてStackに数えたいと思いますが、私は立ち往生しています。熱心に読み込まれたリレーションの返り値Laravel

これは、私が何をしようとしている私がいじってきた多くのソリューションの1つです:

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

    return $subjects; 

Subjectモデルは次のような関係があります。

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

そして、我々は見れば関係がどのように構築されるかについてのStackモデルで:

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 $subjectsanswer_countは空です。

"answers_count": [] 

私はSQLで同じクエリを実行すると、私は空でない結果を得るので、それは非常に紛らわしいです。

select answer, count(*) as aggregate from `answers` where `answers`.`stack_id` in ('1', '6') group by `answer` 

correct 9 
wrong 4 

どのようにすべての回答を数えますか?グループ化する?

答えて

0

answersCount関係を削除

$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; 

さらに掘削がhere

+0

と思えます代わりに、私は何とか説明したようにカウントを取得することは可能でしょうか?それはそれを行うための非常にクリーンな方法のようです。そして、なぜそれが動作しないのか理解できません。 – Adam

+0

私はそれを調べる必要があります私はあなたがこれを試してもうまく思う? –

+1

はい私はそれをテストし、それは動作します。私は今、ブレードファイルでその概念を使用していますが、これはn + 1の問題です。これは雄弁なバグですか? – Adam

0

を見つけることができ、この方法を試してみてください - それはもう必要はありません、あなたは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

関連する問題