Dobře, tady je to, co si myslím se děje:
Nepoužíváte super užitečnou magii vztahů HABTM. Namísto toho, aby se s touto tabulkou zacházelo jako s pouhou relační tabulkou, koláč přejde k definovanému modelu a uvidí vztahy, které jste definovali, a primární klíče a displayFields atd.
To je v pořádku, když máte složitou tabulku HABTM. Ale pokud je to tak, vaše datové pole je celé zpackané, protože nepřidáváte Question
a Qset
odděleně. Chci říct, že to neděláš
$data = array('Question'=>array('title'=>'new_question'),
'Qset'=>array('name'=>'lets say qset'));
$this->Question->saveAll($data);
Tím necháte dort vyřešit asociaci HABTM za vás a tato datová struktura bude v pořádku. Ale ve složce modelu máte svůj vlastní model QsetsQuestion. Data, která ukládáte, by tedy měla být stejná jako u jakékoli jiné tabulky, jako tak
$data = array('qset_id'=> $qset_id,
'question_id'=> $question_id);
$this->Question->QsetsQuestion->save($data);
A to vytvoří nové id v tabulce qsets_questions s novým vztahem, přesně tak, jak chcete.
Buďte však opatrní, protože k tomu používáte svůj vlastní model, pokud správně nenastavíte ověření, můžete mít stejný pár cizích klíčů mnohokrát, protože ve výchozím nastavení stačí zkontrolovat, že id musí být jedinečné .
[UPRAVIT] Po malém vyjasnění řešení výše uvedený „problém“ řeší, ale ve skutečnosti není důvodem tohoto chování.
Cakephp má funkce
Takže když chcete přidat nový řádek, koláč smaže všechny předchozí asociace a přidá nové. Způsob, jak to vyřešit, je najít všechny Qsets
které patří k otázce a přidejte je do $data
pole (s přidáním nového přidružení otázky, které chcete přidat). Tento odkaz
pomohl mi porozumět asociacím HABTM (hledejte „Challenge IV“).
Vím, že řešení, které jsem uvedl dříve, vám pomohlo s „problémem“, ale bylo vytvořeno pod dojmem, že máte QsetsQuestion
modelový soubor někde. Protože to neuděláte, řešením by bylo získat všechny Questions
přidružené a přidejte je jako nové pole. Nebo ve skutečnosti vytvořit QsetsQuestion
model a vytvořte asociace takto:
Qset hasMany QsetsQuestion
QsetsQuestion belongsTo Qset, Question
Question hasMany Qsets.
Nebo změňte chování dortu... Žádný z nich nevypadá hezky, já vím.
Takže shrnutí řešení:
-
Pokaždé, když chcete uložit nové přidružení Qset-Question, načtěte dříve uložená přidružení, vložte je do pole k uložení a uložte je
//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);
Všimněte si, že neexistuje žádná QsetsQuestion
, protože neexistuje. Toto by měla být první možnost, protože model HABTM není složitý
NEBO
-
Vytvořte
QsetsQuestion
ve složce modelu a změňte přidružení, jak je uvedeno výše. Úložná část na ovladači by byla$data = array('qset_id'=>1, 'question_id'=>1) $this->Question->QsetsQuestion->save($data); //also works with $this->Qset->QsetsQuestion
Je to mnohem jednodušší (možná), ale musíte vytvořit nový soubor a nezapomeňte zkontrolovat, že neexistuje žádná předchozí podobná asociace (před vložením zkontrolujte, zda existuje 2-2 n-tice). Jednoduchá pravidla ověřování by měla fungovat.
NEBO
- Změňte chování cakephp pro toto... Tohle se mi nelíbí.