Je suis bloqué depuis un petit moment...
Je une table User et une table Job, un utilisateur peut avoir plusieurs métiers et un métier peut être exercé par plusieurs utilisateurs. Le problème c'est que lors de mon ajout, dans ma table de liaison il me fait un update sur l'id de l'utilisateur. Cela fait que un métier ne peut pas être exercé par plusieurs utilisateurs.

Voici mon code de ma fonction ajouter:

public function addJobUser($idUser, $idJob){
        $this->User->Job->create(array(
            'User' => array('id' => $idUser),
            'Job' => array('id' => $idJob)
        ));
        $this->User->Job->save();
        $this->Session->setFlash("Votre métier a bien été ajouté.","flash_success");
        return $this->redirect(array('action' => 'viewAll'));
    }

Si quelqu'un peut m'aider a comprendre pourquoi cela ne me créer pas un autre enregistrement ...

5 réponses


Romain Richard
Auteur
Réponse acceptée

En fait, si il y a un formulaire avant ... Mais ma logique n'était pas bonne comme tu dis j'ai changer de principe, mais merci quand même.

Bonjour.
Pour commencer, je ne comprends pas trop ta logique.
Normalement, tu passes par un formulaire pour la saisie des données et je ne les vois à aucun moment dans ta fonction.
Car par exemple pour l'ID de l'utilisateur, tu peux la récupérer via le composant Auth ou via la Session dans ta fonction, mais ce n'est pas le cas, à priori tu récupéres la variable via l'URL et étant donné que tu n'as aucune sécurité dans ta fonction, c'est très mauvais.
Ensuite, tu ne fais pas une requête dans la table de liaison, mais dans la table Job à priori.
Tu parles de table de liaison, mais tu ne parles que de 2 tables, la table users et la table jobs, la table de liaison serait la table jobs users (avec un tiret entre les deux noms à la place de l'espace).

Tu veux que l'on t'aide, mais tu ne nous donnes pas les éléments nécessaires pour pouvoir le faire.
Comment veux-tu que nous t'aidions dans ces conditions ?

On peut voir la requête générée ?

Premièrement, regarde ce que dit la doc cakePHP
http://book.cakephp.org/2.0/fr/models/saving-your-data.html#model-updateall-array-fields-mixed-conditions

Pour faire simple : Lorsque tu appelles la fonction save de ton model et que tu initialise un ID, Cakephp considère qu'il s'agit d'un update.
Or tu injectes une valeur (qui peut être en plus non numérique!!!) aux champs id
'User' => array('id' => $idUser)
'Job' => array('id' => $idJb)

Il faut également bien déclarer la relation HABTM dans tes models User et Job

Je te conseille (à vrai dire c'est une obligation) comme Lartak11 de créer une table de liaison User_job des colonnes SQL U.job_id et Job.user_id

Et si tu souhaites consulter la ou plutôt les requêtes sql que CakePhp génère, utilise $this->element('sql_dump'); dans ta vue.