J'utilise Cake 1.2.6 et la nuit dernière, j'ai remarqué qu'une relation HABTM n'était pas enregistrée lorsque je soumettais un formulaire. J'ai une relation HABTM entre Committee
et Volunteer
. La clé primaire pour un Volunteer
est un UUID tandis que la clé primaire pour un Committee
est une chaîne lisible par un humain (par exemple BOARDOFDIRECTORS
, FAIRCOMMITTEE
, FAIRASSOCIATES
, etc.). J'ai un formulaire pour créer/éditer des volontaires et ce formulaire inclut une boîte de sélection dont les options sont exactement ce que vous attendez et sont peuplées avec des options retournées par la méthode de Cake. Bien que je ne puisse pas penser à une raison pour laquelle cela aurait de l'importance, un seul comité peut être sélectionné pour un bénévole (l'HABTM est pour les besoins futurs prévus).Données HABTM endommagées pendant __saveMulti()?
Les premiers résultats montrent que la sélection de l'option BOARDOFDIRECTORS
fonctionne comme prévu, mais pas les autres. Retraçant l'exécution par le code de base me conduit à Model->__saveMulti()
où, Line 1393, ce code est exécuté:
$data[$this->hasAndBelongsToMany[$assoc]['foreignKey']] = $id;
Si je vide $data
avant que le code, la sortie est FAIRASSOCIATES. Immédiatement après, sa valeur est 4AIRASSOCIATES. Il semble raisonnable de supposer que c'est la raison pour laquelle la relation n'est pas sauvegardée, mais je n'ai pas compris pourquoi les données changent à ce stade de l'exécution.
Est-ce que quelqu'un d'autre a déjà vu ça? Ai-je manqué une pièce critique? Au meilleur de ma connaissance, cela fonctionnait bien dans la version 1.2.1 (j'ai mis à jour il y a une semaine environ).
MISE À JOUR
Le premier bit de apparente bizarreries que je vois est que, bien que mon $row
est une chaîne, la condition Line 1366 évalue à true
donc je laisse tomber dans ce bloc de code. Si mes données sont une chaîne, comment peut-elle avoir une valeur de membre?
MISE À JOUR
J'ai clairement une réflexion à faire, mais voici la ligne de fond. Si je laisse tomber journal écrit immédiatement avant et immédiatement après Line 1394 comme ceci:
$this->log('Setting ' . $data . '[' . $this->hasAndBelongsToMany[$assoc]['foreignKey'] . '] = ' . $id, LOG_DEBUG);
$data[$this->hasAndBelongsToMany[$assoc]['foreignKey']] = $id;
$this->log('Creating ' . json_encode($data) . ' on ' . $join, LOG_DEBUG);
La sortie correspondante est:
2010-03-05 18:57:08 Debug: Setting FAIRASSOCIATES[volunteer_id] = 4b78717f-8ad4-4671-b81c-4e8745591fb4
2010-03-05 18:57:08 Debug: Creating "4AIRASSOCIATES" on CommitteesVolunteer
Problèmes possibles:
- Je ne sais pas comment/pourquoi Gâteau essaie de mettre le membre
volunteer_id
sur une chaîne - "FAIRASSOCIATES" est l'ID d'un comité auquel un volontaire er est groupé, pas un modèle d'aucune sorte, donc je ne comprends pas la pertinence de
FAIRASSOCIATES[volunteer_id]
du tout. - Je ne sais pas comment ou pourquoi la valeur de
$data
est transformée en4AIRASSOCIATES
par cette ligne de code.
Belle solution, Jose. Mon intention a été de contourner cela de la même manière, mais je n'avais pas décidé d'une approche. Cela semble bon en attendant des tests approfondis. –