Bonjour,

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

Ce que je fais

j'ai une tables d'association 'testsquestions ' entre table 'tests' et 'questions' donc j'ai questions belongs to many tests and tests belongs to many questions et testsquestions belongs to tests et questions aussi j'ai une table responses belongs to question et tablequestions has many responses .
Je veux afficher le nom du test suivis de ses questions et chaque question suivie de ses reponses de cette façon
Nom du test
1) question num 1

  • rep1
  • rep 2
  • rep n
    2) question num 2
    rep 1
    rep 2

j'ai fait ce code mais je ne suis pas convaincu je veux utiliser notion du matching dans la méme requete mais j'ai pas reussi
donc j'ai fait ces lignes dans le TestQuestionsController

 public function test($id=null)
    {

        $tests=$this->TestsQuestions->Tests->findById($id)->contain(['Questions']);
        $responses=$this->TestsQuestions->Questions->find()->contain(['Responses']);
        $this->set(compact('tests','responses'));
        $this->set('_serialize', ['tests','responses']);
    }

et dans la vue

<?php
foreach ($tests as $test):?>
    <?php echo $test->title ;?>
  <?php  foreach ($test->questions as $ques):?>

    <?php echo  $ques->title ;?>
        <?php  foreach ($responses->responses as $res):?>
        <?php if (($ques->id)===($res->question_id))
            {
              echo  '<br>'. $res->response ;
            }?>

        <?php endforeach;
    endforeach;

 endforeach;

Ce que j'obtiens

j'ai affiché le nom du test et ses questions mes les reponses ne sont pas affichés
Merci en avance , est ce qui'ya d'autres solution plus optimisée

1 réponse


Lartak
Réponse acceptée

Bonjour.
Tu ne te tromperais pas quelque part ?
Normalement, une question n'appartient qu'à un seul test.
Donc pourquoi définir une question à plusieurs tests ?
Je verrais plutôt :

  • Test 1
    • Question 1 (première question du premier test)
      • Response 1 (première réponse de la première question du premier test)
      • Response 2 (deuxième réponse de la première question du premier test)
      • etc ...
    • Question 2 (deuxième question du premier test)
      • Response 1 (première réponse de la deuxième question du premier test)
      • etc ...
    • etc ...
  • Test 2
    • Question 1 (première question du deuxième test)
      • Response (première réponse de la première question du deuxième test)
      • etc ...
    • etc ...
  • etc ...

Donc seulement trois tables et tu pourrais faire :

public function test($id)
{
    $test = $this->Tests
            ->find()
            ->where(['Tests.id' => $id])
            ->contain(['Questions', 'Questions.Responses'])
            ->first();
    $this->set(compact('test'));
}

Puis dans ta vue :

<h2><?= $test->title ?></h2>
<ol>
    <?php foreach($test->questions as $question): ?>
    <li>
        <?= $question->title ?>
    </li>
    <ul>
        <?php foreach($question->responses as $response): ?>
        <li><?= $response->title ?></li>
        <?php endforeach; ?>
    </ul>
    <?php endforeach; ?>
</ol>