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

CakePHP:la creazione di una nuova riga HABTM ne aggiorna invece altre

Ok, ecco cosa penso sta accadendo:

Non stai usando la super utile magia delle relazioni HABTM. Invece di trattare questa tabella come una semplice tabella di relazioni, cake va al modello definito e vede le relazioni che hai definito e primaryKeys e displayFields, ecc.

Va bene quando hai un tavolo HABTM complicato. Ma se è così, il tuo array di dati è tutto incasinato, perché non stai aggiungendo una Question e Qsets separatamente. Quello che voglio dire è che non stai facendo

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

In questo modo, lasci che la torta risolva l'associazione HABTM per te e quella struttura dei dati sarebbe ok. Ma hai il tuo modello QsetsQuestion nella tua cartella del modello. Quindi i dati che salvi dovrebbero essere come con qualsiasi altra tabella, così

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

E questo crea un nuovo ID nella tabella qsets_questions, con la nuova relazione, proprio come desideri.

Fai attenzione, però, dal momento che stai usando il tuo modello per questo, se non imposti le convalide correttamente, potresti avere la stessa coppia di chiavi esterne molte volte, perché per impostazione predefinita cake controlla semplicemente che l'id deve essere univoco .

[MODIFICA] Dopo un po' di chiarimento, la soluzione di cui sopra risolve il "problema", ma in realtà non è la ragione di questo comportamento.

Cakephp ha un funzione

Quindi, quando vuoi aggiungere una nuova riga, cake elimina tutte le associazioni precedenti e aggiunge quelle nuove. Un modo per risolvere questo problema è trovare tutti i Qsets che appartengono a una domanda e aggiungerli a $data array (con l'aggiunta della nuova associazione di domande che si desidera aggiungere). Questo link mi ha aiutato a capire le associazioni HABTM (cerca "Challenge IV").

So che la soluzione che ho fornito prima ti ha aiutato con il "problema", ma è stato dato l'impressione che avessi una QsetsQuestion file modello da qualche parte. Dal momento che non lo fai, la soluzione sarebbe ottenere tutte le Questions associati e aggiungerli come un nuovo array. Oppure effettivamente crea una QsetsQuestion modella e crea le associazioni in questo modo:

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

O cambiare il comportamento della torta... Nessuno di loro sembra carino, lo so.

Quindi, riepilogo per le soluzioni:

  • Ogni volta che vuoi salvare una nuova associazione Qset-Question, recupera le associazioni precedentemente memorizzate, inseriscila nell'array da salvare e salvale

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

Nota che non ci sono QsetsQuestion , poiché non esiste. Questa dovrebbe essere la prima opzione poiché il modello HABTM non è complesso

O

  • Crea QsetsQuestion nella cartella del modello e modificare le associazioni come indicato sopra. La parte di salvataggio sul controller sarebbe

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

È molto più semplice (forse), ma devi creare un nuovo file e ricordati di controllare che non ci siano precedenti associazioni simili (controlla se esistono 2-2 tuple prima di inserirla). Semplici regole di convalida dovrebbero funzionare.

O

  • Cambia il comportamento di cakephp per questo... questo non mi piace.