Добре, ето какво мисля се случва:
Вие не използвате супер полезната магия на отношенията 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 за това... Не ми харесва това.