sql >> Database teknologi >  >> RDS >> Mysql

CakePHP:Oprettelse af ny HABTM række opdaterer i stedet andre

Ok, her er hvad jeg mener sker:

Du bruger ikke den super nyttige HABTM-relationsmagi. I stedet for at behandle denne tabel som en ren relationstabel, går kagen til den definerede model og ser de relationer, du har defineret, og primære nøgler og displayfelter osv.

Det er ok, når du har en kompliceret HABTM-tabel. Men hvis det er tilfældet, er dit dataarray rodet, fordi du ikke tilføjer et Question og Qset separat. Hvad jeg mener er, at du ikke gør

$data = array('Question'=>array('title'=>'new_question'),
              'Qset'=>array('name'=>'lets say qset'));
$this->Question->saveAll($data);

Gør du det, lader du kage løse HABTM-foreningen for dig, og den datastruktur ville være ok. Men du har din egen QsetsQuestion-model i din modelmappe. Så de data, du gemmer, burde være som med enhver anden tabel, sådan

$data = array('qset_id'=> $qset_id,
              'question_id'=> $question_id);
$this->Question->QsetsQuestion->save($data);

Og det skaber et nyt id i tabellen qsets_questions med den nye relation, ligesom du ønsker.

Vær dog forsigtig, da du bruger din egen model til dette, hvis du ikke indstiller dine valideringer korrekt, kan du have det samme par fremmednøgler mange gange, for som standard skal du bare tjekke, at id'et skal være unikt .

[EDIT] Efter lidt afklaring løser løsningen ovenfor "problemet", men det er faktisk ikke årsagen til denne adfærd.

Cakephp har en funktion

Så når du vil tilføje en ny række, sletter kage alle tidligere tilknytninger og tilføjer de nye. En måde at løse dette på er at finde alle Qsets der hører til et spørgsmål, og føj dem til $data array (med tilføjelse af den nye spørgsmålstilknytning, du vil tilføje). Dette link hjalp mig med at forstå HABTM-foreninger (se efter "Challenge IV").

Jeg ved, at den løsning, jeg gav før, hjalp dig med "problemet", men det blev gjort under indtryk af, at du havde et QsetsQuestion modelfil et eller andet sted. Da du ikke gør det, ville løsningen være at få alle Question tilknyttet og tilføje dem som et nyt array. Eller faktisk oprette et QsetsQuestion model, og lav associationerne sådan her:

Qset hasMany QsetsQuestion
QsetsQuestion belongsTo Qset, Question
Question hasMany Qsets.

Eller ændre kagens adfærd... Ingen af ​​dem virker smukke, jeg ved det.

Så opsummering af løsninger:

  • Hver gang du vil gemme en ny Qset-Question-tilknytning, skal du hente de tidligere gemte tilknytninger, lægge den i det array, der skal gemmes, og gem dem

    //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);
    

Bemærk, at der ikke er nogen QsetsQuestion , da det ikke eksisterer. Dette burde være den første mulighed, da HABTM-modellen ikke er kompleks

ELLER

  • Opret QsetsQuestion i din modelmappe og ændre tilknytningerne som angivet ovenfor. Gem-delen på controlleren ville være

    $data = array('qset_id'=>1, 'question_id'=>1)
    $this->Question->QsetsQuestion->save($data);    //also works with $this->Qset->QsetsQuestion
    

Det er meget mere enkelt (måske), men du skal oprette en ny fil, og husk at tjekke, at der ikke er nogen tidligere lignende tilknytning (tjek om der findes 2-2 tuple, før du indsætter den). Simple valideringsregler burde fungere.

ELLER

  • Skift cakephp-adfærd for denne... Jeg kan ikke lide denne.



  1. Understøtter Python MySQL-forberedte erklæringer?

  2. Sådan undgår du, at der ikke er hukommelsesfejl i en browser på grund af for mange ajax-opkald

  3. kan vi indsætte i to tabeller med en enkelt sql-sætning?

  4. Neo4j - Opret et indeks ved hjælp af Cypher