Mysql
 sql >> Datenbank >  >> RDS >> Mysql

CakePHP:Beim Erstellen einer neuen HABTM-Zeile werden stattdessen andere aktualisiert

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.