Oké, dit is wat ik denk gebeurt:
Je gebruikt de superhandige HABTM relatiemagie niet. In plaats van deze tabel te behandelen als louter een relatietabel, gaat cake naar het gedefinieerde model en ziet de relaties die je hebt gedefinieerd en primaryKeys en displayFields, enz.
Dat is oké als je een ingewikkelde HABTM-tabel hebt. Maar als dat het geval is, is je gegevensarray helemaal in de war, omdat je geen Question
toevoegt en Qset
afzonderlijk. Wat ik bedoel is, je doet het niet
$data = array('Question'=>array('title'=>'new_question'),
'Qset'=>array('name'=>'lets say qset'));
$this->Question->saveAll($data);
Als je dat doet, laat je cake de HABTM-associatie voor je oplossen, en die datastructuur zou in orde zijn. Maar je hebt je eigen QsetsQuestion-model in je modelmap. Dus de gegevens die u opslaat, zouden moeten zijn zoals bij elke andere tabel, zoals zo
$data = array('qset_id'=> $qset_id,
'question_id'=> $question_id);
$this->Question->QsetsQuestion->save($data);
En dat creëert een nieuwe id in de tabel qsets_questions, met de nieuwe relatie, precies zoals je wilt.
Wees echter voorzichtig, aangezien u hiervoor uw eigen model gebruikt, als u uw validaties niet correct instelt, kunt u vaak hetzelfde paar buitenlandse sleutels hebben, want standaard cake controleert u gewoon of de id uniek moet zijn .
[EDIT] Na een beetje opheldering lost de bovenstaande oplossing het "probleem" op, maar is niet de reden voor dit gedrag.
Cakephp heeft een functie
Dus als je een nieuwe rij wilt toevoegen, verwijdert cake alle eerdere associaties en voegt de nieuwe toe. Een manier om dit op te lossen is door alle Qsets
. te vinden die bij een vraag horen en voeg ze toe aan de $data
array (met toevoeging van de nieuwe vraagassociatie die u wilt toevoegen). Deze link
heeft me geholpen HABTM-associaties te begrijpen (zoek naar "Challenge IV").
Ik weet dat de oplossing die ik eerder gaf je hielp met het "probleem", maar het werd gemaakt in de veronderstelling dat je een QsetsQuestion
had modelbestand ergens. Aangezien u dat niet doet, zou de oplossing zijn om alle Questions
. te krijgen gekoppeld en voeg ze toe als een nieuwe array. Of maak daadwerkelijk een QsetsQuestion
model, en maak de associaties als volgt:
Qset hasMany QsetsQuestion
QsetsQuestion belongsTo Qset, Question
Question hasMany Qsets.
Of het gedrag van cake veranderen... Geen van hen lijkt mooi, ik weet het.
Dus, samenvatting voor oplossingen:
-
Telkens wanneer u een nieuwe Qset-Vraag-associatie wilt opslaan, haalt u de eerder opgeslagen associaties op, plaatst u deze in de array die moet worden opgeslagen en slaat u ze op
//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);
Let op:er is geen QsetsQuestion
, aangezien het niet bestaat. Dit zou de eerste optie moeten zijn aangezien het HABTM-model niet complex is
OF
-
Maak
QsetsQuestion
in uw modelmap en wijzig de koppelingen zoals hierboven aangegeven. Het opslaggedeelte op de controller zou zijn$data = array('qset_id'=>1, 'question_id'=>1) $this->Question->QsetsQuestion->save($data); //also works with $this->Qset->QsetsQuestion
Het is veel eenvoudiger (misschien), maar je moet een nieuw bestand maken, en vergeet niet te controleren of er geen eerdere vergelijkbare associatie is (controleer of 2-2 tuple bestaat voordat je het invoegt). Eenvoudige validatieregels zouden moeten werken.
OF
- Wijzig het cakephp-gedrag hiervoor... Ik vind deze niet leuk.