Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Kohana] relacja jeden do wielu
Forum PHP.pl > Forum > PHP > Frameworki
ciekawski
witam,
zaczynam przygodę z frameworkiem Kohana i napotkałem na problem z modułem ORM.
Konkretnie chcę zrobić relację jeden do wielu. Mam następujący kod:
  1. class Model_Biblioteka extends ORM
  2. {
  3. protected $_table_name = 'biblioteki';
  4. protected $_primary_key = 'id';
  5.  
  6. protected $_has_many = array(
  7. 'users' => array(
  8. 'model' => 'user',
  9. 'through' => 'biblioteka_has_users',
  10. ),
  11. 'ksiazki' => array(
  12. 'model' => 'ksiazka',
  13. 'foreign_key' => 'ksiazka_id',
  14. ),
  15. );
  16.  
  17.  
  18. }
  19.  
  20.  
  21. class Model_Ksiazka extends ORM
  22. {
  23. protected $_table_name = 'ksiazki';
  24. protected $_primary_key = 'id';
  25.  
  26. protected $_belongs_to = array(
  27. 'biblioteka' => array(
  28. 'model' => 'biblioteka',
  29. 'foreign_key' => 'biblioteka_id',
  30. ),
  31. );
  32.  
  33. protected $_has_many = array(
  34. ...
  35. );
  36. }

Problem jest kiedy mając obiekt Biblioteka chcę dodać do niego książkę. W relacjach wiele do wielu, gdzie mamy zdefiniowane through - jak w przypadku użytkowników, mogę użyć metody add, jak poniżej:
  1. $biblioteka = ORM::factory('biblioteka', 1);
  2. $biblioteka->add('user', ...);
  3.  
  4. // ale to juz nie dziala
  5. $biblioteka->add('ksiazka', $ksiazka); // $ksiazka = ORM::factory('ksiazka', 1);

Czy ktoś wie jak to ugryźć?

z góry dzięki za odpowiedź
nmts
Normalnie - przepraszam, ale takie słowo tutaj najbardziej pasuje.
Ale żeby nie było... to tutaj masz przykłady: http://kohanaframework.org/3.2/guide/orm/examples/simple
ciekawski
Cytat
Normalnie - przepraszam, ale takie słowo tutaj najbardziej pasuje.


hmm, no jednak chyba nie. Zupełnie nie o to mi chodziło, albo czegoś nie rozumiem. W podanym przykładzie nie ma relacji jeden do wielu. Mi chodzi jak dodać książkę do biblioteki (biblioteka może mieć wiele książek, z tymże nie jest to wiele do wielu - gdzie podaje się through i wówczas działa coś takiego $biblioteka->add('ksiazka', $ksiazka); )

nmts
Cytat(ciekawski @ 18.12.2011, 18:19:24 ) *
W podanym przykładzie nie ma relacji jeden do wielu.


Relacje pomiędzy tabelami już masz opisane w modelu i wyglądają z grubsza poprawnie, natomiast to w jaki sposób umieścisz dane w bazie nie ma znaczenia - add() czy has() ułatwiają dodawanie i sprawdzanie przy relacji wiele do wielu, ale nie trzeba z nich korzystać. Przy relacji jeden do wielu powinieneś stworzyć obiekt książki, przypisać mu klucz obcy i zapisać. W podanym linku rzeczywiście nie widać relacji, chodziło raczej o sam sposób zapisu danych w bazie. Tak więc możesz to zrobić tak:

  1. $ksiazka = orm::factory('ksiazka');
  2. $ksiazka->tytul = "Tytuł książki";
  3. $ksiazka->biblioteka_id = 1; // klucz obcy
  4. $ksiazka->save();


Ale możesz też inaczej, bo to nie ma znaczenia, ważne żeby był klucz obcy, i opisana relacja w modelu.

ciekawski
Tak, myślałem, że może jest możliwość zrobienia tego jakby od strony obiektu biblioteka, czyli w skrócie:
  1. $biblioteka = ORM::factory('biblioteka', 1);
  2. $ksiazka = ORM::factory('ksiazka');
  3. // dane ksiazki
  4. $ksiazka->save();
  5. $biblioteka->add('ksiazki', $ksiazka); // no i tutaj wywala blad - przy relacji jeden do wielu jest ok - tam definiujemy through i z tego bierze nazwe tabeli

W moim przypadku jest błąd o treści:
Kod
Database_Exception [ 1103 ]: Incorrect table name '' [ INSERT INTO `` (`....


ale wygląda na to, że tak się nie da - ale szkoda, bo uważam że byłoby całkiem przydatne.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.