Relacje - automat Gii

Witam.

Mam pytanie odnośnie generowania relacji przez Gii. Otóż jeżeli mam relacje wiele do wielu to używam tabeli pośredniej w której są klucze obce pochodzące z tabel które są w tej relacji. Gii dla tabeli pośredniej (tbl_spin) generuje relacje takie:


return array(

                        'pakiet' => array(self::BELONGS_TO, 'Pakiet', 'pakiet_id'),

                        'program' => array(self::BELONGS_TO, 'Program', 'program_id'),

                );

ale dla tabel źródłowych nie generuje już żadnych relacji.

Skoro taka relację trzeba rozbić na MANY_MANY i BELONGS_TO to chyba powinny być zdefiniowane relacje w tabeli źródłowej i tak dla tabeli (tbl_program)




return array('pakiety' => array(self::MANY_MANY, 'Pakiet', 'tbl_spin(program_id,pakiet_id)'),);



i tak dla tabeli (tbl_pakiet)




return array('programy' => array(self::MANY_MANY, 'Program', 'tbl_spin(program_id,pakiet_id)'),);



czy może coś poplątałem?

Tak. Jeżeli nie zdefinujesz np. relacji w modelu tabeli pakiet, to nie będziesz miał jak wyszukać programów zawartych w danym pakiecie. I vice-versa. Pytanie dlaczego gii nie wygenerował tych relacji sam. Nie masz tam gdzieś przypadkiem kluczy złożonych?

Moje tabele wyglądają tak:

  1. tbl_program
  • id_program (int) PK

  • nazwa (varchar)

  • logo (varchar)

  • stb (int)

  • jezyk (varchar)

  • temat (varchar)

  1. tbl_spin (tabela łącząca tbl_program i tbl_pakiet bo tabele są w relacji wiele do wielu)
  • id_spin (int) PK

  • program_id (int) FK

  • pakiet_id (int) FK

  1. tbl_pakiet
  • id_pakiet (int) PK

  • nazwa (varchar)

Najpierw generuję model dla tabeli ‘program’ potem ‘pakiet’ i na końcu ‘spin’ no i tylko dla spin daje relacje.

Generalnie mój widok który obsługuję to dla modelu ‘spin’ w którym to podpiąłem informację pochodzące z tabel źródłowych wg kluczy obcych i mogę wyszukiwać które programy są w jakich pakietach oraz jakie programy zawierają dane pakiety.

Hmm…

Wyrzuć id_spin z tbl_spin i uczyń program_id, pakiet_id kluczem złożonym.

Wtedy Gii nic nie wygeneruje, bo nie obsługuje kluczy złożonych.

Nie wygeneruje nic dla tabeli pośredniej. Dla tbl_program i tbl_pakiet wygeneruje relacje wiele do wielu.

Tabele i klucze są OK. Okazało się, że należy najpierw generować model dla tabeli łączącej a dopiero później dla źródłowych. Teraz relacje są wygenerowane. Dla łączącej są typu BELONGS_TO a dla źródłowych typu HAS_MANY. Tak chyba powinno być, wg przewodnika Yii:


W terminologii AR, możemy wytłumaczyć relację wiele-do-wielu jako kombinację BELONGS_TO oraz HAS_MANY