Bonjour,

Bon, les seuls probleme que j'ai avec cakephp c'est les sauvegardes habtm..

Comment sauvegarder les relations HABTM avec une colone dans la table de liaison(en plus des 2 foreign key) en une seule fois ?
Mes tests ne sauvegardent bien les relations (les 2 foreign key) mais laisse l'autre colone de la table de liaison vide.

Exemple :

-Car HABTM User
-Car(id, name)
-User(id, username)
-CarsUsers (id, car_id, user_id, jourDeConduite)
-Les utilisateurs sont déjà créés et ne bougent pas.
->Un utilisateur créait une voiture et choisis son jour de conduite, et laisse la voiture à disposition les autres jours pour d'autre utilisateurs

Et ce que je suis bon dans le formulaire de la vue voiture déjà ?

echo $this->Form->create('Car');
echo $this->Form->input('name');
echo $this->Form->input('CarsUser.jourDeConduite');
echo $this->Form->end(__('Submit'));

Puis dans le controller :

$this->request->data["User"]["User"] = $this->Session->Read('Auth.User.id');
$this->Car->save($this->request->data);
//$this->Car->saveAssociated($this->request->data);

Cet exemple sauvegarde bien la nouvelle voiture, et la relation entre la voiture et l'utilisateur mais laisse la colone jourDeConduite vide

Comment faire ?

Merci

5 réponses


Bonjour.
Première chose qui m'étonne dans le create de ton formulaire, c'est que tu lui définis Voiture pour la clé de modèle, alors que ton modèle devrait logiquement se nommer Char.
Ensuite, je ne sais pas si tu as fait une erreur de frappe, mais dans le code que tu nous montres, tu aurais des tables nommées char et user ?
Dans le code de ton controller, tu définis l'id de l'utilisateur dans $this->request->data['User']['User'], il serait plutôt judicieux de le définir dans $this->request->data['CharsUser']['user_id'], tu ne crois pas ?
Ton champ jourDeConduite, il est bien de format date dans ta base de données ?
Pour terminer, vu que dans ce cas là tu n'as besoin que de sauvegarder dans la table chars_user, pourquoi tu n'y fais pas directement la sauvegarde dans cette table là au lieu de passer par la table chars ?

Zorexs
Auteur
  • Pour voiture c'est bien juste une erreur de frappe, j'ai corrigé

    echo $this->Form->create('Car');
  • Je comprends pas quand tu me parle de char par contre. Voiture => Car, et Voitures => Cars pour moi, et la console de cake l'a compris comme ça

  • $this->request->data['User']['User'] c'est ce que me sort de debuguer cake lorsque je fais un HABTM classique en formulaire, donc j'ai recopié.
    J'ai donc testé $this->request->data['CarsUsers']['user_id'] = $this->Session->Read('Auth.User.id'); et ca ne change rien, c'est juste 2 systaxe possible différentes apparemment

  • jourDeConduite est de type varchar (jour de la semaine), c'est juste pour l'exemple

  • Pour utiliser "chars_user", donc pour moi je comprends "cars_user", enfaite dans mon vrai code "cars" a plusieurs relations donc je trouve plus pratique de passer par le controller "Cars", mais si tu me dis qu'autre chose fonctionne, je prends
    Je précise bien que je fais une création de car en même temps que la relation avec l'user par contre

Zorexs
Auteur

Jviens de mettre les dossier du app dans un zip si c'est utile
https://mega.co.nz/#!00AzVRoC!5tP-jSMEp5DCFPm7AxvX1e3vMUZ0WhmD0QUZHLI0JeU

Désolé pour char, je voulais saisir car, j'ai un peu confondu avec une application que je code en ce moment, dans laquelle j'ai des personnages et par conséquent un modèle Char.
Non, tu peux rester sur le controller Cars, mais je te demandais pourquoi tu fais un $this->Car->save au lieu d'attaquer directement le modèle CarsUser via un $this->CarsUser->save, mais si tu fais une création dans un modèle lié également, je comprends mieux.
Fais-tu des règles de validation concernant les champs pour le formulaire ?
Si dans ta table cars_user la création de l'enregistrement s'effectue bien, que tous les champs se remplissent bien sauf celui nommé jourDeConduite, il ne peut y avoir que deux raisons, soit la valeur de ce champ envoyée en requête est vide, soit le format attendu en base de données n'est pas le même que celui qui lui est envoyé.
Dans les deux cas, vu la situation, ce n'est pas un problème de relation entre les tables.

Zorexs
Auteur

Bah,
(pour faire plus simple, dans le code de test j'ai appelé "jour" au lieu de "jourDeConduite" que ce soit dans la base de donné ou dans le code)

On est d'accord que c'est bien la bonne syntaxe

        echo $this->Form->input('CarsUser.jour');

Quand je fais un export sql de la table :

CREATE TABLE IF NOT EXISTS `cars_users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `car_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `jour` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

Et la seul regle que je fais dans le model pour "jour" est "notEmpty"

En debuguant j'ai :

array(
    'Car' => array(
        'name' => 'Coucou'
    ),
    'User' => array(
        'User' => array(
            (int) 0 => '1'
        )
    ),
    'CarsUser' => array(
        'jour' => 'mercredi',
        'user_id' => (int) 1
    )
)

Avec ca, la voiture est crée, la relation entre la voiture est l'utilisateur est faite, mais le jour n'est pas enregistré

Si tu veux voir/tester le code que j'ai mis juste avant en zip

Edit : j'ai fait une erreur dans le debugg, que j'ai corrigé, mais le résultat final est le même