Bonjour,

Je suis actuellement confronté à un problème, je me suis renseigné à droite à gauche mais je ne trouve pas la solution.

Je suis dans le controller "Courses" et je souhaite faire un enregistrement dans ma table courses (cela fonctionne) puis un enregistrement dans ma table "coursesteachers" qui associe un professeur à un cours ( impossible de mettre le professeur dans la table course car un cours peut avoir plusieurs professeurs).

Je fais donc cet enregistrement :

<?php
if($this->Course->save($d, true, array('title','description','created','lastUpdate', 'type')))
            {
                $this->loadModel('Course');
                $course_id = $this->Course->find('first', array(
            'fields' => array('Course.id'),
            'order' => array('Course.id' => 'desc')
                    ));

            $this->loadModel('Coursesteacher');
            $v=array();

            $v'Coursesteacher']'id_course']=$course_id'Course']'id'];
            $v'Coursesteacher']'id_user']=$this->Auth->user('id');
            debug($this->Course->Coursesteacher->save($v, true, array('id_user','id_course'))); //On ajoute l'utilisateur à la liste des professeurs du cours
}
?>

Je n'arrive pas à enregistrer quoi que ce soit dans ma table "coursesteachers", quelqu'un saurait-il comment faire ?

6 réponses


ker0x
Réponse acceptée

Si tu relisais ton code tu verrais qu'il y a des erreurs dans ton tableau $data !

  • 1.
    Tu fais un saveAssociated en passant par le model Course sur ton tableau $data mais celui-ci n'a aucun tableau Course avec l'id du cours dedans...
  • 2.
    Tes tableaux de liaison Coursetopic et Coursesteacher dans $data ont les noms des champs de liaison incorrect! Par convention c'est model_id et non id_model

Bonsoir.
Déjà, il y a un truc illogique dans le début de ton code.
Tu dis que tu es dans ton controller courses, qui par conséquent est nativement lié à ton modèle Course, tu fais un save dans ce dit modèle et ensuite tu fais un loadModel sur celui-ci.
Tu ne crois pas que tu fais une manipulation totalement inutile et sans aucun sens ?
Ensuite, si tu fais un loadModel pour ton modèle Courseteacher, il est inutile de faire :

$this->Course->Coursesteacher->save

un simple :

$this->Coursesteacher->save

est suffisant normalement.
Pour terminer, si un cours est associé à un professeur, il serait préférable de mettre ton champ de liaison dans ton modèle Course et indiques de préférence tes liaisons dans tes modèles, ce qui aura pour effet d'éviter des manipulations supplémentaires dans tes actions de tes controller.
Dans l'exemple, tu devrais donc avoir ta table "courses" avec :

- id
- title
/* etc */
- teacher_id

et donc ta table teachers avec les champs que tu souhaites, sans champ de liaison particulier avec la table courses dans celle-ci.

Bonsoir,

Concernant le premier point tu as totalement raison, c'est une ligne totalement inutile.
Pour le deuxième point j'ai initialement essayé sans "Course" et ça ne marchait pas non plus, j'ai cru que je devais tout de même le laisser mais en y réfléchissant c'est bête.

Concernant ta dernière remarque je ne peux pas ajouter un "teacher_id" dans ma table "Courses" car il peut y avoir plusieurs professeurs pour un unique cours. Je dois donc créer une table reliant courses et users.

D'où la table suivante :

CREATE TABLE IF NOT EXISTS coursesteachers(
id int(15) NOT NULL AUTO_INCREMENT,
user\_id int(10) NOT NULL,
course\_id int(15) NOT NULL,
PRIMARY KEY (id)
);

Pour résumé j'ai donc ceci :

<?php
if($this->Course->save($d, true, array('title','description','created','lastUpdate', 'type')))
            {
                $course_id = $this->Course->find('first', array(
                'fields' => array('Course.id'),
                'order' => array('Course.id' => 'desc')
                    ));

            $this->loadModel('Coursesteacher');
            $v=array();

            $v'Coursesteacher']'id_course']=$course_id'Course']'id'];
            $v'Coursesteacher']'id_user']=$this->Auth->user('id');
            $this->Coursesteacher->save($v, true, array('id_user','id_course')); //On ajoute l'utilisateur à la liste des professeurs du cours
}
?>

Une petite idée ? :)

Le plus recommandé, est de définir ton association dans les modèles concernés.
Et si nécessaire, tu fais :

$this->Course->saveAssociated

au lieu de :

$this->Course->save

Je te conseille de regarder dans la doc de CakePHP, pour voir comment faire.

Donc je devrais faire quelque chose du genre :

<?php
$this->loadModel('Course');
                $course_id = $this->Course->find('first', array(
                'fields' => array('Course.id'),
                'order' => array('Course.id' => 'desc')
                    ));

            $v=array();
            $v'Coursesteacher']'id_user']=$this->Auth->user('id');

                $data = array(
                    'Coursetopic' => array('id_course' => $course_id'Course']'id']], 'id_topic' => 0),

                    'Coursesteacher' => array('id_course' => $course_id'Course']'id'], 'user_id' => $v'Coursesteacher']'id_user']),

                    );
            $this->Course->saveAssociated($data, array('deep' => true));
?>

Cela ne change rien à mon résultat malheureusement ...

Merci, l'erreur était donc toute bête. Ma BDD respectait les conventions de CakePHP mais mon code demandait quelque chose de complètement loufoque !

Résolu :)