OK, oto co myślę się dzieje:
Nie używasz super przydatnej magii relacji HABTM. Zamiast traktować tę tabelę jako zwykłą tabelę relacji, ciastko przechodzi do zdefiniowanego modelu i widzi zdefiniowane przez Ciebie relacje oraz primaryKeys i displayFields itp.
To jest w porządku, gdy masz skomplikowany stół HABTM. Ale jeśli tak jest, twoja tablica danych jest pomieszana, ponieważ nie dodajesz Question
i Qset
osobno. Mam na myśli to, że nie robisz
$data = array('Question'=>array('title'=>'new_question'),
'Qset'=>array('name'=>'lets say qset'));
$this->Question->saveAll($data);
Robiąc to, pozwalasz ciastu rozwiązać za Ciebie asocjację HABTM i ta struktura danych byłaby w porządku. Ale masz swój własny model QsetsQuestion w swoim folderze modelu. Tak więc dane, które zapisujesz, powinny być takie jak w każdej innej tabeli, tak jak tak
$data = array('qset_id'=> $qset_id,
'question_id'=> $question_id);
$this->Question->QsetsQuestion->save($data);
A to tworzy nowy identyfikator w tabeli qsets_questions, z nową relacją, tak jak chcesz.
Uważaj jednak, ponieważ używasz do tego własnego modelu, jeśli nie ustawisz prawidłowo walidacji, możesz mieć tę samą parę kluczy obcych wiele razy, ponieważ domyślnie wystarczy sprawdzić, czy identyfikator musi być unikalny .
[EDYTUJ] Po pewnym wyjaśnieniu powyższe rozwiązanie rozwiązuje „problem”, ale w rzeczywistości nie jest przyczyną takiego zachowania.
Cakephp ma funkcja
Więc kiedy chcesz dodać nowy wiersz, ciastko usuwa wszystkie poprzednie skojarzenia i dodaje nowe. Sposobem na rozwiązanie tego jest znalezienie wszystkich Qsets
które należą do pytania i dodaj je do $data
tablica (z dodatkiem nowego powiązania pytania, które chcesz dodać). Ten link
pomógł mi zrozumieć skojarzenia HABTM (poszukaj „Wyzwanie IV”).
Wiem, że rozwiązanie, które podałem wcześniej, pomogło ci z "problemem", ale powstało pod wrażeniem, że masz QsetsQuestion
plik modelu gdzieś. Ponieważ nie, rozwiązaniem byłoby uzyskanie wszystkich Questions
powiązane i dodaj je jako nową tablicę. Lub faktycznie utwórz QsetsQuestion
modelować i tworzyć skojarzenia w ten sposób:
Qset hasMany QsetsQuestion
QsetsQuestion belongsTo Qset, Question
Question hasMany Qsets.
Albo zmienić zachowanie ciasta... Żaden z nich nie wydaje się ładny, wiem.
Tak więc podsumowanie rozwiązań:
-
Za każdym razem, gdy chcesz zapisać nową asocjację Qset-Question, pobierz poprzednio zapisane asocjacje, umieść je w tablicy, która ma zostać zapisana, i zapisz 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);
Zauważ, że nie ma QsetsQuestion
, ponieważ nie istnieje. To powinna być pierwsza opcja, ponieważ model HABTM nie jest skomplikowany
LUB
-
Utwórz
QsetsQuestion
w folderze modelu i zmień skojarzenia, jak wskazano powyżej. Część zapisywania na kontrolerze byłaby$data = array('qset_id'=>1, 'question_id'=>1) $this->Question->QsetsQuestion->save($data); //also works with $this->Qset->QsetsQuestion
Jest to o wiele prostsze (być może), ale musisz utworzyć nowy plik i pamiętaj, aby sprawdzić, czy nie ma poprzedniego podobnego skojarzenia (sprawdź, czy istnieje krotka 2-2 przed wstawieniem). Powinny działać proste zasady walidacji.
LUB
- Zmień zachowanie cakephp na to... Nie podoba mi się to.