sql >> Databasteknik >  >> RDS >> Mysql

CakePHP:Skapa ny HABTM-rad uppdaterar istället andra

Ok, här är vad jag tror händer:

Du använder inte den superanvändbara HABTM-relationsmagin. Istället för att behandla denna tabell som bara en relationstabell, går kakan till den definierade modellen och ser de relationer du har definierat och primärnycklar och visningsfält, etc.

Det är ok när du har ett komplicerat HABTM-bord. Men om så är fallet är din datamatris förstörd, eftersom du inte lägger till en Question och Qset separat. Vad jag menar är att du inte gör

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

Om du gör det låter du kakan lösa HABTM-föreningen åt dig, och den datastrukturen skulle vara ok. Men du har din egen QsetsQuestion-modell i din modellmapp. Så data du sparar bör vara som med vilken annan tabell som helst, som så

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

Och det skapar ett nytt id i tabellen qsets_questions, med den nya relationen, precis som du vill.

Var dock försiktig, eftersom du använder din egen modell för detta, om du inte ställer in valideringarna korrekt, kan du ha samma par främmande nycklar många gånger, för som standard måste du bara kontrollera att id:t måste vara unikt .

[REDIGERA] Efter lite förtydligande löser lösningen ovan "problemet", men är faktiskt inte orsaken till detta beteende.

Cakephp har en funktion

Så när du vill lägga till en ny rad raderar cake alla tidigare associationer och lägger till de nya. Ett sätt att lösa detta är att hitta alla Qsets som hör till en fråga och lägg till dem i $data array (med tillägg av den nya frågeföreningen du vill lägga till). Denna länk hjälpte mig att förstå HABTM-associationer (leta efter "Challenge IV").

Jag vet att lösningen jag gav tidigare hjälpte dig med "problemet", men det gjordes under intrycket att du hade en QsetsQuestion modellfil någonstans. Eftersom du inte gör det, skulle lösningen vara att få alla Questions associerade och lägg till dem som en ny array. Eller skapar faktiskt en QsetsQuestion modell och gör associationerna så här:

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

Eller ändra kakans beteende... Ingen av dem verkar snygg, jag vet.

Så, sammanfattning av lösningar:

  • Varje gång du vill spara en ny Qset-Question-association, hämta de tidigare lagrade associationerna, lägg den i arrayen som ska sparas och spara 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);
    

Observera att det inte finns någon QsetsQuestion eftersom det inte finns. Detta bör vara det första alternativet eftersom HABTM-modellen inte är komplex

ELLER

  • Skapa QsetsQuestion i din modellmapp och ändra associationerna enligt ovan. Spara delen på styrenheten skulle vara

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

Det är mycket enklare (kanske), men du måste skapa en ny fil, och kom ihåg att kontrollera att det inte finns någon tidigare liknande association (kontrollera om det finns 2-2 tuplar innan du infogar den). Enkla valideringsregler borde fungera.

ELLER

  • Ändra cakephp-beteende för den här... Jag gillar inte den här.



  1. Hur synkroniserar man Mysql till Bigquery i realtid?

  2. Användardefinierade variabler i PostgreSQL

  3. Hur man skapar pivottabell i MySQL

  4. Paginering med MySQL LIMIT, OFFSET