Cześć,
chciałbym Was zapytać jak w Laravel najlepiej jest rozwiązać problem dziedziczenia (i czy to słuszny pomysł na rozwiązanie problemu?), oraz jak to najwydajniej zrobić.
Żeby nie wchodzić w zbędne szczegóły posłużmy się przykładem potworków :)
Wszystkie potwory
w aplikacji mają atrybuty wymiary, waga, żywioł, lokalizacja, okres występowania
Teraz zależnie od żywiołu
potwora będę tworzył żywiołaki, ale każdy może mieć zupełnie inne atrybuty i funkcje:
-wodne
będą miały atrybut czy słono, czy słodkowodne, funkcje gaszenia pożaru, maksymalna głębokość zanurkowania,
-powietrzne
udźwig materiału w locie, mogą zrobić podmuch i rodzaj pokarmu jaki spożywają...
i tak dalej i tak dalej...
Do tego w danej lokalizacji
może występować tylko jeden potwór z danego żywiołu
, więc tworząc nowego muszę sprawdzić czy nie ma już jakiegoś o danym żywiole
np. w lokalizacji
Azeroth, a nawet jak był to może już wymarł (okres wystepowania
) i może wtedy przyjść następny na jego miejsce (tutaj pojawia się też problem archiwizacji danych, ponieważ chciałbym wiedzieć w jakim okresie i co tam występowało).
To co mi przychodzi do głowy to stworzyć klasę/model główny potwor
i wrzucić to do jednej tabeli razem ze wszystkimi wspólnymi atrybutami, a dodatkowo status czy wymarł czy nie. Następnie połączyć to w relacji polimorficznej z każdym kolejnym modelem odpowiedzialnym za dany żywioł
.
Teoretycznie w ten sposób wszystko będzie działało.
Pytanie jednak czy takie rozwiązanie będzie optymalne? Z tego co pamiętam jeszcze pisanie gierek w Javie to jak nic prosi się o zaimplementowanie jakiejś formy dziedziczenie po potworze dla każdego żywiołu. Jak to wtedy rozpisać w Laravel z uwzględnieniem migracji? Czy w ogóle rozpisywać, jeżeli pracujemy właśnie na modelach z odwzorowaniem wszystkiego w bazie danych, tak żeby trzymać się jako takiej normalizacji?
Uprzedzając uwagi - nie chce pisać gry w Laravel, po prostu taki mi przyszedł motyw, żeby ubrać w słowa bardziej złożony problem :P
Chodzi mi głównie o ogólne koncepcje przy tego typu modelach i prawidłowym podejściu, bo napisać da się to na pewno jeszcze na kilka sposobów.
Nie wiem czy zrozumiale rozpisałem problem, w razie czego pytajcie, a uzupełnię brakujące informacje.