Bonjour,

Voila je rencontre un petit problème avec mon code.

J'ai cette url :quizz/public/question/?id=1
Quand je vais sur mon lien de la question avec l'id 4 pour voir mes réponses
J'obtiens cette url :quizz/public/reponse/?id=4
J'obtiens bien que les réponses de la question avec se code :

/**
 * @Route("/reponse")
 */
class ReponseController extends AbstractController
{
    /**
     * @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!!!
            'reponses' => $reponses,

        ]);
    }

Par contre quand je fais retour à la page, j'obtiens : quizz/public/question/, mon id disparaît et ne m'affiche plus mes questions.
Du coup, j'ai su afficher du questionnaire, ces questions avec la clez étrangère "questionnaire_id" et pareil pour les réponse avec la clef étrangère "question_id" mais je n'arrive pas à aller dans le sens inverse.

4 réponses


bidule
Réponse acceptée

Lady je te revoies vers l'autre post où justement je te parle de ça.
Dans ton cas pas besoin d'attaquer le repository mais bien l'Entity c'est là la puissance de Doctrine.

Quand tu interoges l'Entity tu as directement accès aux Entity Enfants et à leurs contenu.

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

Une fois dans ta vue tu pourras avoirs toutes tes questions et les réponses liées.
Regarde le modele que j'ai mis sur l'autre post.

Bonjour les routes symfony ne marche pas comme ça:

class ReponseController extends AbstractController
{
    /**
     * @Route("/{id}", name="reponse_index", methods={"GET"})
     */
    public function index( QuestionRepository $questionRepository, ReponseRepository $reponseRepository,$id): Response
    {
        // rechercher plusieurs objets reponse correspondant au question
        // dump($request->query->get('id'));
        $reponses = $reponseRepository->findBy(['question' => $id]);
        return $this->render('reponse/index.html.twig', [
            // Afficher que les réponses par rapport à son IdQuestion!!!
            'reponses' => $reponses,

        ]);
    }

et l'url sera quizz/public/reponse/4

c'est plus 'propre' avec ce système la route quizz/public/reponse/ n'existe pas, l'id est obligatoire.

Merci pour ta réponse, olive140, oui je comprends qu'il faut mettre {id}, mais dans mon cas

 <a href="{{ path('question_index', {'id': questionnaire.id}) }}" class="orange"><h3>{{ questionnaire.libelleQuestionnaire }}</h3></a> 

je veux afficher les questions de son questionnaire, du coup, je ne peux pas mettre

     /**
     * @Route("/{id}", name="question_index", methods={"GET"})
     */

si ce n'est pas l'id de la question, mais du questionnaire que j'ai besoin

Avec se code, je sais voir mes réponses avec le bon id de la question et retourner ensuite à la question du bon id questionnnaire


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

        $reponses = $reponseRepository->findBy(['question' => $request->query->get('id')]);
        // dump($reponses);

        $questions=$questionRepository->findBy(['id' => $request->query->get('id')]);
        // dump($questions[0]->getQuestionnaire()->getId());

        return $this->render('reponse/index.html.twig', [
            // Afficher que les réponses par rapport à son IdQuestion!!!
            'questions' => $questions[0]->getQuestionnaire()->getId(),
            // Je chercher l'id questionnaire par rapport à l'id de la question (ex: id=4)
            'reponses' => $reponses,

        ]);
    }

Merci Bidule, sur le coup je n'avais pas trop compris ton explication, comme je débute sur Symfony, mais je viens de comprendre et c'est beaucoup plus simple comme ça et aussi plus propre, Merci beaucoup ;)
Voilà mon code modifier :

QuestionnaireControler :


    /**
     * @Route("/home/", name="home" , methods={"GET"})
     * @param Questionnaire $questionnaire
     * @return Response
     */
    public function home(QuestionnaireRepository $questionnaireRepository, QuestionRepository $questionRepository): Response
    {
        return $this->render('questionnaire/home.html.twig', [
            'questionnaires' => $questionnaireRepository->findAll(),
            'questions' => $questionRepository->findAll(),
        ]);
    }
    /**
     * @Route("/{id}", name="question_quiz", methods={"GET"})
     * @param Questionnaire $questionnaire
     * @return Response
     */
    public function quiz(Questionnaire $questionnaire): Response
    {
       return $this->render('question/quiz.html.twig',[
           'questionnaire' => $questionnaire,
        ]);
    }
    <div class="center container">
    <h1>Questionnaire </h1>
    <div class="blocs">
        {% for questionnaire in questionnaires %}
            <!--Liens doit mener aux questions du questionnaire !!!-->
            <a href="{{ path('question_quiz', {'id': questionnaire.id}) }}" class="vert btnBloc">
                <div class="bloc">
                    <h3>{{ questionnaire.libelleQuestionnaire }}</h3>
                </div>
            </a>
        {% else %}
                <p>Il n'y a pas de questionnaire &#128546;</p>
        {% endfor %}
    </div>
</div>