Voilà comment se présente la chose : J'ai: 1 Modèle Lesson** 1 Modèle Chapter** 1 Modèle Post** Vous l'aurez compris : Une leçon contient plusieurs chapitres, qui eux même contiennent plusieurs posts Pour faire ça j'ai relié les tables Lesson et chapter par une table de liaison (ChapterLesson) et idem pour Chapter et Post (ChapterPost) J'ai créé les modèles ChapterLesson et ChapterPost [code]<?php class ChapterPost extends AppModel{
public $useTable = "chapters_posts";
public $actsAs =array('containable');
public $belongsTo = array('Chapter', 'Post');
}
?>[/code] [code]<?php class ChapterLesson extends AppModel{
public $useTable = "chapters_lessons";
public $actsAs =array('containable');
public $belongsTo = array('Chapter', 'Lesson');
}
?>[/code] puis, voilà ma fonction pour visualiser une leçon dans le LessonController : Mon problème est que j'aimerai afficher pour la leçon donnée, ses chapitres (ça c'est ok ça marche) Mais aussi pour chaque chapitre de cette leçon => les posts qui sont associés (et là je n'y arrive pas du tout :) ) [code]function show($id = null, $slug = null) { $this->Lesson->recursive = -1; $this->Lesson->contain('Chapter'); $this -> loadModel('ChapterLesson'); $this -> loadModel('Chapter'); $this->ChapterLesson->contain('Chapter'); $d['chapters'] = $this->ChapterLesson->find('all', array( 'conditions' => array( 'ChapterLesson.lesson_id' => $id, ), 'order' => array('ChapterLesson.chapterposition ASC'), )); debug($d['chapters']);die(); $this->set($d); }[/code] Voilà ce que j'obtiens avec un debug : [code]array( (int) 0 => array( 'ChapterLesson' => array( 'id' => '184', 'lesson_id' => '2', 'chapter_id' => '158' ), 'Chapter' => array( 'id' => '158', 'name' => 'Le taux de transformation', 'slug' => 'taux-de-transformation', 'content' => '', 'created' => '0000-00-00', 'online' => '0', 'count' => '0', ) ) ), (int) 1 => array( 'ChapterLesson' => array( 'id' => '186', 'lesson_id' => '2', 'chapter_id' => '4', ), 'Chapter' => array( 'id' => '4', 'name' => 'Installer et configurer WordPress', 'slug' => 'installer-et-configurer-wordpress', 'content' => '', 'created' => '0000-00-00', 'online' => '0', 'count' => '0', ) ) ),[/code] On voit bien ici que j'obtiens bien les Chapitres (Chapter) de la leçon, mais j'aimerai également obtenir les posts (Post) qui appatiennent à chacun des chapitres. Questions: 1/Ai-je fais une erreur dans les associations de modèles ? 2/Ou est-ce ma requête qui est mauvaise ? Si quelqu'un a une requête meilleure que la mienne dans le code de ma fonction SHOW dans mon LessonController, je suis preneur :) Fred

2 réponses


  1. tu peux faire ta requete depuis Chapter

    $this->Chapter->find('all','conditions'=>'Chapter.lesson_id'=>$id]]);

  2. Tu utilises le behavior containable dans les modèles, puis

    $this->Lesson->find('all','conditions'=>'Lesson.id'=>$id],'contain'=>'Chapter'=>'Post']]]);

PS: avec contain, pas besoin de faire des loadmodel.

JPH
Auteur

Merci de ta réponse, très sympa.
En revanche, je ne comprends pas tout :)
1/ Comme je veux afficher une leçon, je passe logiquement par le LessonController, est-ce pertinent de passer par le ChapterController pour afficher une leçon ? ou tout simplement peut-on le faire sans problème ?
2/ En utilisant ta requête dans le ChapterController, comment je passe l'ID de la leçon ? Depuis les Routes ?

$this->Chapter->find('all','conditions'=>'Chapter.lesson_id'=>$id]]);

Pour être plus clair, j'aimerai obtenir les Urls successives suivante
Pour voir la leçon -> /lesson
Pour voir un chapitre de la leçon -> /lesson/nom-du-chapitre
Pour voir un post du chapitre -> /lesson/nom-du-chapitre/nom-du-post

Ma première requête étant la 1 pour voir la lesson.

Merci à toi. ça me permet déjà d'avoir une piste pour arriver à ce que je veux :)

Fred