affichage avec une requête imbriquée ORM cakephp3

Par ikb, il y a 10 ans


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

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, il y a 10 ans

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>