sql >> Database >  >> RDS >> Mysql

CakePHP:nieuwe HABTM-rij maken, in plaats daarvan updaten andere

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.



  1. Versnel to_sql() bij het schrijven van Pandas DataFrame naar Oracle-database met behulp van SqlAlchemy en cx_Oracle

  2. Rows_sent:12 Rows_examined:549024 - hoe mySQL-query optimaliseren?

  3. Zoeken naar geavanceerd php/mysql pagineringscript

  4. Hoe geef je meerdere CheckBox-waarden door AJAX en verwerk je ze?|