sql >> Databáze >  >> RDS >> Mysql

CakePHP:Vytvoření nového řádku HABTM místo toho aktualizuje jiné

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í.



  1. Tipy pro monitorování MySQL pro Moodle

  2. Příklady YEARWEEK() – MySQL

  3. Co je nového s replikací MySQL v MySQL 8.0

  4. Používání Microsoft Access s Power BI