Bonjour,

Voilà, je rencontre un petit problème avec mon code et je débute à peine avec Symfony.

Je crée un quiz avec des questionnaires, dans les questionnaires, il y a des questions et les questions ont des réponses.
Sur la page questionnaire, j'ai des titres (liens) qui mènent chacun a leurs questions, sauf que pour le moment, il m'affiche toutes les questions de n'importe quelle questionnaire et la même chose pour les réponses, quand je clique sur le liens de la question, j'ai toutes les réponses de toutes les questions.

J'avais pensé faire une fonction dans le QuestionController avec des tableaux pour l'affichage, mais je ne sais pas trop comment mis prendre ( $responses = [$question => 'reponse ' ];) ou peut-être, il faut que je mette autres choses à la place de "findAll()" pour les reponses.

/**
 * @Route("/question")
 */
class QuestionController extends AbstractController
{
    /**
     * @Route("/", name="question_index", methods={"GET"})
     */
    public function index(QuestionRepository $questionRepository, ReponseRepository $reponseRepository): Response
    {
        return $this->render('question/index.html.twig',[
            'questions' => $questionRepository->findAll(),
            'reponses' => $reponseRepository->findAll(),
        ]);
    }
<?php

namespace App\Entity;

use App\Repository\QuestionRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=QuestionRepository::class)
 */
class Question
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $libelleQuestion;

    /**
     * @ORM\ManyToOne(targetEntity=TypeDeQuestion::class, inversedBy="questions")
     * @ORM\JoinColumn(nullable=false)
     */
    private $typeDeQuestion;

    /**
     * @ORM\OneToMany(targetEntity=Reponse::class, mappedBy="question")
     */
    private $reponses;

    /**
     * @ORM\ManyToOne(targetEntity=Questionnaire::class, inversedBy="questions")
     * @ORM\JoinColumn(nullable=false)
     */
    private $Questionnaire;

    public function __construct()
    {
        $this->reponses = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getLibelleQuestion(): ?string
    {
        return $this->libelleQuestion;
    }

    public function setLibelleQuestion(string $libelleQuestion): self
    {
        $this->libelleQuestion = $libelleQuestion;

        return $this;
    }

    public function getTypeDeQuestion(): ?TypeDeQuestion
    {
        return $this->typeDeQuestion;
    }

    public function setTypeDeQuestion(?TypeDeQuestion $typeDeQuestion): self
    {
        $this->typeDeQuestion = $typeDeQuestion;

        return $this;
    }
    public function getQuestionnaire(): ?Questionnaire
    {
        return $this->Questionnaire;
    }

    public function setQuestionnaire(?Questionnaire $Questionnaire): self
    {
        $this->Questionnaire = $Questionnaire;

        return $this;
    }
    /**
     * @return Collection|Reponse[]
     */
    public function getReponses(): Collection
    {
        return $this->reponses;
    }

    public function addReponse(Reponse $reponse): self
    {
        if (!$this->reponses->contains($reponse)) {
            $this->reponses[] = $reponse;
            $reponse->setQuestion($this);
        }

        return $this;
    }

    public function removeReponse(Reponse $reponse): self
    {
        if ($this->reponses->contains($reponse)) {
            $this->reponses->removeElement($reponse);
            // set the owning side to null (unless already changed)
            if ($reponse->getQuestion() === $this) {
                $reponse->setQuestion(null);
            }
        }

        return $this;
    }
    public function __toString() {
    return $this->getLibelleQuestion();
    }
}

3 réponses


LadiesFox
Auteur
Réponse acceptée

Merci @Tom-22 de m'avoir répondu rapidement, j'ai trouvé la solution à mon problème , maintenant d'autre problème à résoudre :P


    /**
     * @Route("/", name="reponse_index", methods={"GET"})
     */
    public function index( QuestionRepository $questionRepository, ReponseRepository $reponseRepository, Request $request): Response
    {
        // rechercher plusieurs objets reponse correspondant au question
        // dump($request->query->get('id'));
        $reponses = $reponseRepository->findBy(['question' => $request->query->get('id')]);

        return $this->render('reponse/index.html.twig', [
            // Afficher que les réponses par rapport à son IdQuestion!!!
            'questions' => $questionRepository->findAll(),
            'reponses' => $reponses,

        ]);
    }
bidule
Réponse acceptée

Salut,

Je suis sur un projet du même type avec la possibilité de gérer plusieurs questionnaires, avec plusieurs questions et plusieurs réponses.

En gros mon questionnaire à 19 questions et chacunes de ces questions à 6 réponses.
Dans cette optique j'ai mis en place 3 entity:
Une Entity polls pour gérer plusieurs questionnaires:
Une Entity Questions qui gère les questions avec une liaison ManyToOne avec l'Entity Polls
Une Entity Answers qui gère les réponses avec une liaison ManyToOne avec l'Entity Questions

De se fait, lorsque je fais ceci :

 /**
     * @Route("/{id}", name="testpoll", methods={"GET"})
     * @param Polls $poll
     * @return Response
     */
    public function testPoll(Polls $poll): Response
    {
        return $this->render('home/index.html.twig', [
            'poll' => $poll,
        ]);
    }

J'ai accès à l'ensemble de la relation Polls=>Questions=>Answers

Et dans ma vue (pour le moment) en faisant ceci (l'id ici correspond à celui du questionnaire):

{% block body %}
    <h1>Polls</h1>
            <h1>{{ poll.title }}</h1>
            {% for question in poll.questions %}
                <fieldset>
                    <div class="form-card">
                        <h2>{{ question.questionNumber ~ " " ~ question.wording }}</h2>
                        <div class="row">
                            {% for answer in question.answers %}
                                <div class="col-md-10 mx-0">
                                    <p>{{ question.questionNumber ~ "." ~ answer.answerNumber ~ " " ~ answer.wording}}</p>
                                </div>
                                <div class="col-md-2 mx-0">
                                </div>
                            {% endfor %}
                        </div>
                    </div>
                </fieldset>
            {% endfor %}
{% endblock %}

J'affiche chaque Question du questionnaire suivi de ses réponses (il reste à y intégrer un petit input afin de gérer le retours)
Ce qui ne m'empeche pas d'avoir accès à une seule question et de la meme manière (grace à la liaison ManyToOne) de pouvoir avoir accès aux réponses liées à la question.

++
yann

Hello,
C'est tout à fait normal que tu te retrouve avec toutes les questions et toutes les réponses, c'est le but même du findAll()
Tu utilise deux répo différents (Q et R) alors que je pense qu'il existe une relation entre Q et R : une Q correspond à une R et inversement. (et peut-être même qu'une réponse peut correspondre à plusieurs questions mais ça c'est à toi de voir)
Du coup je pense que tu pourrais partir sur quelque chose comme une requête spécifique avec des join join dql ou en fonction de comment tu compte afficher tes questions / réponses, tu peux utiliser le findBy()
En gros, pour une Q avec l'id 10, pour afficher sa réponse tu utilise cet même id et dans ton répo tu rajoute une clause WHERE comme ça tu vas récup la réponse quand id est = 10