Ok, hier ist, was ich denke geschieht:
Sie verwenden nicht die super nützliche HABTM-Beziehungsmagie. Anstatt diese Tabelle als reine Beziehungstabelle zu behandeln, geht Cake zum definierten Modell und sieht die Beziehungen, die Sie definiert haben, und primaryKeys und displayFields usw.
Das ist in Ordnung, wenn Sie eine komplizierte HABTM-Tabelle haben. Aber wenn das der Fall ist, ist Ihr Datenarray völlig durcheinander, weil Sie keine Question
hinzufügen und Qset
separat. Was ich meine ist, dass du es nicht tust
$data = array('Question'=>array('title'=>'new_question'),
'Qset'=>array('name'=>'lets say qset'));
$this->Question->saveAll($data);
Wenn Sie das tun, lassen Sie Cake die HABTM-Assoziation für Sie auflösen, und diese Datenstruktur wäre in Ordnung. Aber Sie haben Ihr eigenes QsetsQuestion-Modell in Ihrem Modellordner. Die Daten, die Sie speichern, sollten also wie bei jeder anderen Tabelle sein, so
$data = array('qset_id'=> $qset_id,
'question_id'=> $question_id);
$this->Question->QsetsQuestion->save($data);
Und das erstellt eine neue ID in der Tabelle qsets_questions mit der neuen Relation, genau wie Sie es möchten.
Seien Sie jedoch vorsichtig, da Sie dafür Ihr eigenes Modell verwenden und Ihre Validierungen nicht korrekt festlegen, haben Sie möglicherweise oft das gleiche Fremdschlüsselpaar, da Kuchen standardmäßig nur überprüft, ob die ID eindeutig sein muss .
[BEARBEITEN] Nach ein wenig Klärung löst die obige Lösung das "Problem", ist aber nicht der eigentliche Grund für dieses Verhalten.
Cakephp hat einen Funktion
Wenn Sie also eine neue Zeile hinzufügen möchten, löscht Cake alle vorherigen Assoziationen und fügt die neuen hinzu. Eine Möglichkeit, dies zu lösen, besteht darin, alle Qsets
zu finden die zu einer Frage gehören und füge sie den $data
hinzu Array (mit der Hinzufügung der neuen Fragenzuordnung, die Sie hinzufügen möchten). Dieser Link
hat mir geholfen, HABTM-Assoziationen zu verstehen (suchen Sie nach "Challenge IV").
Ich weiß, dass die Lösung, die ich zuvor gegeben habe, Ihnen bei dem "Problem" geholfen hat, aber sie wurde unter dem Eindruck gemacht, Sie hätten eine QsetsQuestion
Modelldatei irgendwo. Da Sie dies nicht tun, wäre die Lösung, alle Questions
zu erhalten verknüpft und fügen Sie sie als neues Array hinzu. Oder tatsächlich eine QsetsQuestion
erstellen model, und stellen Sie die Assoziationen wie folgt her:
Qset hasMany QsetsQuestion
QsetsQuestion belongsTo Qset, Question
Question hasMany Qsets.
Oder das Verhalten von Kuchen ändern ... Keiner von ihnen scheint hübsch zu sein, ich weiß.
Also, Zusammenfassung für Lösungen:
-
Jedes Mal, wenn Sie eine neue Qset-Question-Assoziation speichern möchten, rufen Sie die zuvor gespeicherten Assoziationen ab, fügen Sie sie in das zu speichernde Array ein und speichern Sie sie
//find previously associated Qsets, lets say it's 1,2,3 and 4 $data = array('Question'=>array('id'=>1), 'Qsets'=>array('Qsets'=>array(1,2,3,4, $new_qset)); $this->Question-save($data);
Beachten Sie, dass es keine QsetsQuestion
gibt , da es nicht existiert. Dies sollte die erste Option sein, da das HABTM-Modell nicht komplex ist
ODER
-
Erstellen Sie
QsetsQuestion
in Ihrem Modellordner und ändern Sie die Zuordnungen wie oben angegeben. Der Sicherungsteil auf dem Controller wäre$data = array('qset_id'=>1, 'question_id'=>1) $this->Question->QsetsQuestion->save($data); //also works with $this->Qset->QsetsQuestion
Es ist viel einfacher (vielleicht), aber Sie müssen eine neue Datei erstellen und daran denken, zu überprüfen, dass es keine vorherige ähnliche Zuordnung gibt (überprüfen Sie, ob 2-2-Tupel vorhanden sind, bevor Sie sie einfügen). Einfache Validierungsregeln sollten funktionieren.
ODER
- Ändere das Cakephp-Verhalten dafür... Das gefällt mir nicht.