Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Object-oriented programming _ [PHP i SQL] wiele obiektów i ilośc zapytań do mysql

Napisany przez: hub 22.03.2019, 14:04:10

hej,
mam następujące klasy:
-klient (może zawierać wiele obiektów - projektów)
-projekt

Nie mogę sobie wyobrazić, jak skonstrukować relację między nimi, żeby robiąc np. podsumowanie wyników wszystkich projektów jednego klienta wykonać jak najmniej zapytań do bazy.
Jeżeli w obiekcie klienta będę przechowywał obiekty projektów - to pobranie danych z bazy, dla każdego z nich będzie wymagało takiej liczby zapytań ile jest projektów. Brzmi to mega nieoptymalnie, jeżeli mógłbym zrobić jedno zapytanie wyciągające z bazy dane dot. wszystkich projektów danego klienta.
Czy normalną praktyką jest operowanie na jednej tabeli bazy danych w dwóch różnych klasach? Jeżeli później będę chciał wprowadzić zmianę w tej tabeli to będę musiał wprowadzać zmiany we wszystkich klasach, w których ta tabela jest wykorzystywana - nie brzmi to jak prawidłowe z punktu widzenia OOP rozwiązanie. Co w takiej sytuacji? Dla każdej tabeli indywidualna klasa-model?

Napisany przez: kapslokk 22.03.2019, 14:08:58

Relacja one-to-many. Jeden klient - wiele projektów.
Tworzysz oddzielne tabele klient i projekt, w tabeli projekt masz id klienta. Na podstawie tego ID możesz robić JOIN'a w zapytaniu i wyciągać wszystkie projekty klienta jednym zapytaniem. Później to odpowiednio grupujesz/przetwarzasz w PHP i tyle.

Napisany przez: hub 22.03.2019, 14:19:46

tak, to rozumiem i nie chodzi mi o format zapytania do bazy
jak to ugryźć z uwzględnieniem wzorców projektowych (ciężko nazwać mi fachowo problem i nie mogę wygooglać rozwiązania, które odpowiadałoby na moje pytanie)

W klasie projektu tworzę metodę do wyciągania danych np. results(), która zawiera zapytanie do bazy po id projektu.

Jak powinno się rozwiązać results() dla klienta, jeżeli to suma wszystkich projektów?
1. do obiektu klienta wrzucić obiekty projektów i pętlą wywoływać Project->results() ?
2. czy zdefiniować zapytanie do bazy w Client->results() po id klienta?

Napisany przez: kapslokk 22.03.2019, 14:27:29

Chyba próbujesz zrobić coś w stylu Active Record...
Myślałeś nad podejściem np. takim, żeby klasy Klient i Projekt miały tylko właściwości/metody, które dotyczą ich danych i dodatkowo stworzyć jakieś Repozytoria, które będą służyć do wyciągania danych nt. Projektów/Klientów?

Chodzi mi o oddzielenie klas służących do wyciągania danych z bazy od klas, które faktycznie te dane reprezentują.

Napisany przez: hub 22.03.2019, 15:00:59

wielkie dzięki smile.gif to jest dokładnie to czego mi brakowało - dodanie dodatkowej warstwy odpowiadającej za wyciąganie danych
ograniczałem się wyobraźnią do MVC (dosłownie 3 warstw wynikających z nazwy) i nie dało się tego w ogóle sensownie ogarnąć

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)