Mysql
 sql >> Baza danych >  >> RDS >> Mysql

CakePHP:Tworzenie nowego wiersza HABTM zamiast aktualizacji innych

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. vBulletin jako login dla całej witryny (edycja:osiągnięto pewien postęp)

  2. dopasowanie do słów ze znakami akcentu, umlautami itp. mysql/php

  3. Sprawdź typ pliku dla JPG, JPEG, PNG

  4. Dlaczego ta instrukcja rs=st.executeQuery(zapytanie); nie wykonuje? Jak mogę wybrać tylko tabelę w zależności od typu input=radio z mysql z dwóch tabel?

  5. Najlepszy sposób na przechowywanie wartości zakodowanej base64 w bazie danych MySQL?