2010-12-15 106 views
0

je l'association suivante:CakePHP sauver deux modèles, deuxième basés sur la première

Groupe hasAndBelongsToMany utilisateur, avec les groups_users table de jointure.

Lorsque je crée un nouveau groupe, je veux ajouter à la table de jointure le fondateur du groupe.

Mon $ this-> tableau de données ressemble à:

Array 
    (
[Group] => Array 
    (
     [name] => seyufgsduifsj 
     [access] => 2 
     [founder_id] => 3 
     [random_key] => I6XC7uMTelpTSdq8DbtLPjqubiF7s6Pn 
    ) 

[GroupsUser] => Array 
    (
     [user_id] => 3 
     [group_role_id] => 1 
     [random_key] => PZsDZXcoCTHw1IuvqsfURVpPX6AcZ3r2 
    ) 

)

J'ai essayé avec save() et saveAll(), mais ne ferait que le groupe dans le tableau des groupes et non l'association de groupe d'utilisateurs. Donc, fondamentalement, j'ai une forme d'ajout où l'utilisateur remplit le nom de groupe et l'accès. Ensuite, si les données sont validées, j'ajoute quelques valeurs de champs supplémentaires au tableau de groupes (comme random_key) et au tableau de tables jointes (comme user_id et group_role_id). Je veux que Cake sauvegarde d'abord le groupe, prenne son identifiant, mette à jour le tableau de la table jointe avec le bon id_groupe, puis enregistre également ce second tableau.

Est-ce possible de façon directe, ou dois-je écrire deux méthodes save() conséquentes, pour la seconde fournissant le dernier identifiant inséré dans le premier?

Merci!

Répondre

0

Peut-être les modèles connexes sont ne pas réussir la validation. Utilisez le morceau de code ci-dessous pour enregistrer que si tous les modèles valident:

$this->Group->saveAll($this->data, array('validate' => 'only')); 

Si vous ne trouvez pas votre groupe en cours d'enregistrement, cette fois, il est très probablement des règles de validation dans la jointure modèle qui échouent . Ma conjecture est que vous avez une validation notEmpty pour le group_id, que vous devriez supprimer pour que saveAll() fonctionne.

Espérons que cela vous dirige vers la résolution de votre problème.


EDIT: Vos associations sont un peu hors. Voici ce qu'il devrait être:

Group hasMany GroupsUser 
User hasMany GroupsUser 
GroupRole hasMany GroupsUser 
GroupsUser belongsTo Group 
GroupsUser belongsTo User 
GroupsUser belongsTo GroupRole 

supprimer l'association hasAndBelongsToMany entre les groupes et l'utilisateur. Il n'existe plus.

+0

J'ai suivi votre suggestion et probablement il ne sauvera pas en raison d'une erreur de validation dans le modèle de jointure. Ayant ceci à l'esprit, j'ai effacé tous les paramètres de validation du modèle de jointure, et ** encore ** les données ne sont pas sauvegardées. – linkyndy

+0

Pourquoi changer la relation HABTM avec plusieurs hasMany - belongsTo? HABTM n'est-il pas destiné à ces situations? – linkyndy

+0

Citant du livre: "Il est parfois souhaitable de stocker des données supplémentaires avec une association de plusieurs à plusieurs." À ce stade, vous devez utiliser un hasMany Through, et non une relation HABTM. http://book.cakephp.org/view/1039/Associations-Linking-Models-Together#hasMany-through-The-Join-Model-1650 – RabidFire

3

Vous pouvez utiliser la fonction saveAll(), mais vous devez modifier le format du tableau GroupsUser. Selon la documentation de saveAll() vos données devrait ressembler à ceci:

Array 
    (
[Group] => Array 
    (
     [name] => seyufgsduifsj 
     [access] => 2 
     [founder_id] => 3 
     [random_key] => I6XC7uMTelpTSdq8DbtLPjqubiF7s6Pn 
    ) 

[GroupsUser] => Array 
    (
     [0] => Array 
      (
       [user_id] => 3 
       [group_role_id] => 1 
       [random_key] => PZsDZXcoCTHw1IuvqsfURVpPX6AcZ3r2 
      ) 
    ) 
) 

Votre exemple fonctionnerait si la relation est Groupe belongsTo GroupsUser, mais je crois que ce n'est pas votre cas

+0

Merci pour votre réponse, mais ma relation est GroupsUser belongsTo Group, car GroupsUser est la table de jointure HABTM. De toute façon, j'ai déjà essayé votre solution et cela n'a sauvé que le groupe. – linkyndy