2017-10-01 1 views
2

J'ai donc Subject qui contient Stack, qui contiennent Question. Pour chaque question, il y a des réponses, et je voudrais compter les réponses sur tous les Stack, mais je suis coincé.Nombre de retour sur une relation avide-chargé Laravel

C'est ce que je suis en train de faire, l'une des nombreuses solutions que j'ai tripotage avec:

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

    return $subjects; 

Le modèle Subject a la relation suivante:

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

Et si nous regardons au modèle Stack sur la façon dont les relations sont construites:

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'); 
} 

Mais quand je return $subjects, answer_count est vide. Il est très déroutant car lorsque j'exécute la même requête en SQL, j'obtiens des résultats non vides.

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

correct 9 
wrong 4 

Alors, comment puis-je compter toutes les réponses? Et les grouper?

Répondre

0

essayer cette façon,

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

De plus creuser se trouve here

+0

Cela semble une alternative, mais serait-il possible d'aller chercher le compte comme je l'ai décrit d'une manière ou d'une autre? Cela semble être une façon très propre de le faire. Et je ne peux pas comprendre pourquoi ça ne marche pas non plus. – Adam

+0

J'ai besoin de regarder à ce sujet pour que je suppose que vous avez bien essayé cela? –

+1

Oui, je l'ai testé et cela fonctionne. Im maintenant en utilisant ce concept dans le fichier lame, mais c'est un problème n + 1 je suppose .. Est-ce un bug éloquent? – Adam

0

Supprimer answersCount relation - il est plus nécessaire, puisque vous pouvez utiliser la méthode 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

Oui, une bonne solution, mais malheureusement, je voudrais regrouper le compte dans 'correct' et' wrong'. – Adam

+0

Donc créer 2 relations appropriées et appeler withCount pour les deux si elles –

+0

C'est ce que j'ai fait pour le moment, j'ai 'wrongAnswer()' et 'correctAnswer()' sur le modèle de la pile. Et je peux appeler 'withCount()' et même joindre un 'where' si je veux attraper un utilisateur spécifique. – Adam