Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Doctrine oraz dziedziczenie
Forum PHP.pl > Forum > PHP
Fluke
Witam,

Ostatnio napotkałem się na mały problem odnośnie dziedziczenia w Doctrine 2(SINGLE_TABLE).
Mam tabelę `product` a w niej typ produktu `sell`, 'buy', 'sell-buy'. Chciałem sobie zrobić dziedziczenie na podstawie tych typów. Wszystko śmiga. Problem pojawia się w tedy gdy edytuję np Product\Sell i chciałbym go zmienić na Product\Buy, a disciminator column nie może się pojawić w klasie Product, chyba sam doctrine zmienia to pole na podstawie nazwy klasy. Kombinowałem na taki sposób, że kopiowałem dane z obiektu Sell do obiektu Buy(wraz z id) ale doctrine tworzy mi nowy rekord.

Zastanawia mnie jak to dziedziczenie ma się do modyfikacji danych.

Pozdrawiam smile.gif
Crozin
1. Takie coś nie ma najmniejszego sensu (czy to w kontekście ORM-a czy ogólnie OOP), więc Doctrine nie wspiera czegoś takiego.
2. Jeżeli dany produkt może mieć stan "na sprzedaż", "kupię" bądź oba na raz, czy nie powinna to być zwykła właściwość obiektu, a nie typ?
3. Opisz dokładniej swój model danych.
Fluke
Chciałem sobie zrobić coś w ten styl.
Mam faktury i te faktury mogą być typu sprzedaż bądź kupno i w zależności od tego jaką fakturę tworzymy takiego typu produkty możemy do niej dodawać.
Czyli jeśli mamy fakturę typy sprzedaż to możemy dodać produkty typu sell a jak kupno to produkty typu buy.

Wydawało by mi się to sensowne i na jakimś poziomie kontrolowane.

  1. class SellInvoice {
  2. //..
  3. public function addProduct(ProductSell $product) {
  4. }
  5. //..
  6. }
  7.  
  8. class BuyInvoice {
  9. //....
  10. public function addProduct(ProductBuy $product) {}
  11. //...
  12. }
Crozin
1. Takie coś, to miejsce na użycie typów generycznych - niestety PHP ich nie wspiera.
2. Dlaczego w ogóle chcesz nagle zmieniać w swojej aplikacji typ obiektu (pomijając już w ogóle Doctrine i bazy danych) - jak już pisałem nie jest to normalna operacja z punktu widzenia OOP.

Właściwie jedyne rozwiązanie jakie przychodzi mi do głowy to ręczne wykonanie zapytania zmieniającego wartość kolumny disciminator oraz ręczne zajęcie się wszelkim możliwymi konsekwencjami tego (usunięcie/zmodyfikowanie obiektów z relacji).
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.