Mysql
 sql >> база данни >  >> RDS >> Mysql

CakePHP:Създаването на нов HABTM ред вместо това актуализира други

Добре, ето какво мисля се случва:

Вие не използвате супер полезната магия на отношенията HABTM. Вместо да третира тази таблица като обикновена таблица на релациите, cake отива към дефинирания модел и вижда релациите, които сте дефинирали, първични ключове и displayFields и т.н.

Това е добре, когато имате сложна HABTM таблица. Но ако случаят е такъв, вашият масив от данни е объркан, защото не добавяте Question и Qset отделно. Имам предвид, че не правиш

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

Правейки това, оставяте cake да разреши HABTM асоциацията вместо вас и тази структура от данни ще бъде наред. Но вие имате свой собствен модел QsetsQuestion в папката на вашия модел. Така че данните, които запазвате, трябва да са като с всяка друга таблица, така

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

И това създава нов идентификатор в таблицата qsets_questions, с новата връзка, точно както искате.

Внимавайте обаче, тъй като използвате собствен модел за това, ако не зададете правилно валидирането, може да имате една и съща двойка външни ключове много пъти, защото по подразбиране просто проверете дали идентификаторът трябва да е уникален .

[РЕДАКТИРАНЕ] След малко изясняване, горното решение наистина решава „проблема“, но всъщност не е причината за това поведение.

Cakephp има функция

Така че, когато искате да добавите нов ред, cake изтрива всички предишни асоциации и добавя новите. Начин за решаване на това е да намерите всички Qsets които принадлежат на въпрос и ги добавете към $data масив (с добавянето на новата асоциация на въпросите, която искате да добавите). Тази връзка ми помогна да разбера асоциациите на HABTM (потърсете „Предизвикателство IV“).

Знам, че решението, което дадох преди, ви помогна с "проблема", но беше направено под впечатлението, че имате QsetsQuestion модел файл някъде. Тъй като не го правите, решението би било да получите всички Questions свързани и ги добавете като нов масив. Или всъщност създайте QsetsQuestion модел и направете асоциациите по следния начин:

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

Или да промените поведението на тортата... Нито един от тях не изглежда красив, знам.

И така, обобщение за решения:

  • Всеки път, когато искате да запишете нова асоциация Qset-Question, извлечете съхранените по-рано асоциации, поставете я в масива, който ще бъде запазен, и ги запазете

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

Имайте предвид, че няма QsetsQuestion , тъй като не съществува. Това трябва да е първият вариант, тъй като моделът HABTM не е сложен

ИЛИ

  • Създайте QsetsQuestion в папката на вашия модел и променете асоциациите, както е посочено по-горе. Частта за запазване на контролера ще бъде

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

Много по-просто е (може би), но трябва да създадете нов файл и не забравяйте да проверите дали няма предишна подобна асоциация (проверете дали съществуват 2-2 кортежи, преди да го вмъкнете). Простите правила за валидиране трябва да работят.

ИЛИ

  • Променете поведението на cakephp за това... Не ми харесва това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как се подигравате с MySQL (без ORM) в Node.js?

  2. Коя SQL заявка отнема повече време? (MYSQL)

  3. Добър урок за това как да актуализирате вашата Mysql база данни с PHP формуляр?

  4. Mysql подниз

  5. Как да вмъкна празен ред, но автоматичният номер да се актуализира правилно?