Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework][ZF2] Doctrine 2 generowanie Entites z DB
Forum PHP.pl > Forum > PHP > Frameworki
netvalue
Cześć

Po przez doctrine-module orm:conver-mapping -from data-base , próbuje wygenerowac Entites ale otrzymuje blad

  1. Table category_product has no primary key.


moje tabel sql:
  1. CREATE TABLE IF NOT EXISTS `category_product` (
  2. `id_category` int(11) NOT NULL,
  3. `id_product` int(11) NOT NULL
  4. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  5.  
  6. CREATE TABLE IF NOT EXISTS `product` (
  7. `id_product` int(11) NOT NULL AUTO_INCREMENT,
  8. `name` varchar(255) CHARACTER SET utf8 NOT NULL,
  9. PRIMARY KEY (`id_product`),
  10. KEY `product_name` (`name`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;



Niestety nie moge ustawić primary key w tabeli category_product poniewaz sa tam rekordy np:

id_category | id_product
2 | 3
2 | 4
10| 3


Co moge zrobic w takim przypadku ?
Crozin
Powinieneś założyć klucz podstawowy na dwie kolumny:
  1. ...
  2. KEY `pk` (`id_category`, `id_product`)
  3. ...
kosmos
Nie możesz do tabeli category dodać innego podstawowego klucza?
id|id_category | id_product
1|2 | 3
2|2 | 4
3|10| 3
netvalue
ok a co w przypadku gdy mam jeszcze jedna tabelke
  1. CREATE TABLE IF NOT EXISTS `product_feature` (
  2.  
  3. `id_product` int(11) DEFAULT NULL,
  4. `name` varchar(60) DEFAULT NULL
  5.  
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


i przykładowo moge mieć teraz:

id_product | name
1 | cecha 1
1 | cecha 2
2 | cecha 1

jaki tutaj klucz dac ?
kosmos
Mógłbyś tu zamieścić schemat relacyjny swojej bazy danych?
Ciężko mi zgadnąć o co konkretnie Ci chodzi, co chcesz osiągnąć smile.gif
To co podałem powyżej nie jest "najładniejszym" rozwiązaniem jeśli chodzi o zasady projektowania.

Póki co masz tabelę
1. produkt
2. kategorie produktów
3. funkcja produktu

produkt ma swoje kategorie czyli np. buty X zaliczymy do butów sportowych a buty Y do butów galowych, ale do butów galowych możemy zaliczyć też buty Z i P

Produkt ma swoje funkcje czyli, buty A będą do biegania, ale też do wspinania. Jednak zastosowanie butów do biegania mogą mieć też buty B i G

Sugerując się powyższym przykładem pomiędzy tymi tabelami będą relacje n:n a więc potrzebne są tabele pośrednie.

Musisz poczytać o relacjach pomiędzy tabelami, o postaciach normalnych, pozyskać podstawową wiedzę. Nie można się zabierać za pisanie apliacji bazodanowej nie znając zasad projektowania BD.

Wszystko zależy co chcesz osiągnąć, na podstawie założeń tworzysz model a następnie programujesz. Nigdy w odwrotnej kolejności.

Jeśli się mylę co do mojego stwierdzenia to przepraszam, ale sądząc po pytaniach odniosłem wrażenie, że taka wiedza jest Ci potrzeba.
netvalue
teraz otrzumje przy generowaniu Entitre:
Table product_params has no primary key.





  1. CREATE TABLE IF NOT EXISTS `category` (
  2. `id_category` int(11) NOT NULL,
  3. `name` varchar(255) DEFAULT NULL,
  4. `id_parent` int(11) NOT NULL,
  5. PRIMARY KEY (`id_category`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  7.  
  8. -- --------------------------------------------------------
  9.  
  10. --
  11. -- Struktura tabeli dla tabeli `category_product`
  12. --
  13.  
  14. CREATE TABLE IF NOT EXISTS `category_product` (
  15. `id_product` int(11) NOT NULL,
  16. `id_category` int(11) NOT NULL,
  17. PRIMARY KEY (`id_product`,`id_category`),
  18. KEY `fk_product_has_category_category1_idx` (`id_category`),
  19. KEY `fk_product_has_category_product_idx` (`id_product`)
  20. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  21.  
  22. -- --------------------------------------------------------
  23.  
  24. --
  25. -- Struktura tabeli dla tabeli `product`
  26. --
  27.  
  28. CREATE TABLE IF NOT EXISTS `product` (
  29. `id_product` int(11) NOT NULL,
  30. `name` varchar(255) DEFAULT NULL,
  31. PRIMARY KEY (`id_product`)
  32. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  33.  
  34. -- --------------------------------------------------------
  35.  
  36. --
  37. -- Struktura tabeli dla tabeli `product_params`
  38. --
  39.  
  40. CREATE TABLE IF NOT EXISTS `product_params` (
  41. `id_product` int(11) NOT NULL,
  42. `name` varchar(255) DEFAULT NULL,
  43. KEY `fk_product_params_product1_idx` (`id_product`)
  44. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  45.  
  46. --
  47. -- Ograniczenia dla zrzutów tabel
  48. --
  49.  
  50. --
  51. -- Ograniczenia dla tabeli `category_product`
  52. --
  53. ALTER TABLE `category_product`
  54. ADD CONSTRAINT `fk_product_has_category_product` FOREIGN KEY (`id_product`) REFERENCES `product` (`id_product`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  55. ADD CONSTRAINT `fk_product_has_category_category1` FOREIGN KEY (`id_category`) REFERENCES `category` (`id_category`) ON DELETE NO ACTION ON UPDATE NO ACTION;
  56.  
  57. --
  58. -- Ograniczenia dla tabeli `product_params`
  59. --
  60. ALTER TABLE `product_params`
  61. ADD CONSTRAINT `fk_product_params_product1` FOREIGN KEY (`id_product`) REFERENCES `product` (`id_product`) ON DELETE NO ACTION ON UPDATE NO ACTION;
kosmos
Ok teraz po schemacie widzę mniej więcej co i jak.
Tabela category_product jest ok. Nic już tam nie dodawaj. Jest to tabela pośrednia dzięki którym tworzona jest relacja wiele do wielu pomiędzy produktem a kategorią.
W tej chwili Twój produkt ma wiele parametrów. Ale tabela product_params nie ma swojego klucza podstawowego smile.gif Musisz go dodać.
product_params
id_product_params
id_product
name

Ta dyskusja podchodzi bardziej pod bazy danych a nie frameworki ...
netvalue
faktycznie... nie przespana noc daje sie we znaki smile.gif dzieki
kosmos
Nie ma za co, na zdrowie wink.gif
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.