Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: UserManager czyli jak z niego korzystac
Forum PHP.pl > Forum > PHP > Object-oriented programming
DBR
witam,

mam klase User, ktora jest typowa klasa uzytkownika (login, email itd) oraz UserManager, ktora odpowiada za komunikacje z baza danych, pobieranie jednego lub wielu uzytkownikow z bazy, dodawanie, update pol uzytkownika itd. zwykle korzystam z niej np poprzez:

  1. $login = 'jakis login';
  2. $user = new User($login);
  3. $user_manager = new UserManager();
  4. $user_manager->insert($user);


korzystam tez z niej gdy chce pobrac usera, jego login, zdjecie profilowe itd, w podobny mniej wiecej sposob:

  1. $user_manager = new UserManager();
  2. $user = $user_manager->selectOneById(666);


mam jednak taki problem, ze korzystam z UserManagera w wielu miejscach programu. drukuje np liste najnowszych fotek w serwisie i w klasie do pobierania fotek dobieram do fotki dane usera funkcja selectOneById. tworze tam za kazdym razem nowego UserManagera, przez co jest on tworzony tyle razy ile jest fotek. wiem ze moge w tej funkcji pobierajacej fotki zmienic zapytanie na pobieranie z dwoch tabel (fotek i userow) i wtedy bede mial te dane, ale chce miec obiekt usera w fotce, bo mam w nim rozne inne przydatne rzeczy ktorych tym zapytaniem nie wyciagne.

czy podejscie tworzenie nowego UserManagera za kazdym razem jest zle i wplywa negatywnie na wydajnosc? czy zmienienie funkcji selectOneById na funkcje statyczna i korzystanie z tego jak UserManager::selectOneById(666) bedzie lepszym podejsciem? a moze trzymac jedna instancje UserManagera na wywolanie aplikacji i w funkcji tylko pobierac te instancje i z niej korzystac? a moze nalezy zastosowac jakies inne podejscie?
askone
Bardziej niż problemem tworzenia nowych obiektów zastanowiłbym się nad wydajnością wykonywania zapytań do bazy celem pobrania danych o jednym userze. Rozwiązanie, któe stosujesz pobierając za każdym razem info tylko o jednym użytkowniku jest wąskim gardłem. Lepiej będzie po stronie skryptu zbudować takie zapytanie aby pobrać dane o wszystkich userach jednym zapytaniem.

Wykorzystaj klauzulę:
Kod
where user.id in (1, 3, 5, 10)


Pozdrawiam
by_ikar
Jak pisałem swojego userMenagera, to się też nad tym zastanawiałem. Co wybrać w momencie kiedy potrzebuje pobrać więcej niż jednego usera? W przypadku powiedzmy 10 użytkowników, stworzenie do każdego użytkownika nowej klasy problemem większym nie będzie. Ale w przypadku listy powiedzmy 80 użytkowników, to moim zdaniem byłoby to dość niewydajne. Tak więc mam metodę getListUsers() która przyjmuje 4 parametry i zwraca tablicę użytkowników. Pierwszy parametr to ilość użytkowników których chcę zwrócić, drugi to "offset" czyli w przypadku paginacji indeks od którego zaczyna się "kolejna strona". Trzeci parametr (tablica) to kryteria, bo wiadomo, mogę sobie zwrócić wszystkich użytkowników, aktywnych użytkowników, zablokowanych użytkowników itp itd (coś ala where). W czwartym parametrze podaję pola które potrzebuje, np id, login, status, email itp (coś ala select). Nie wiem czy to jest najlepszy sposób, ale w wielu przypadkach zwracam właśnie na jednej stronie koło 60-80 użytkowników i tworzenie dla każdego użytkownika nowego obiektu byłoby moim zdaniem przesadą.

Trzymaj jedną instancje swojego menagera, po co ich więcej? wink.gif
DBR
dzieki, za wskazowki, oczywiscie przydatne ale troche nie do konca o to mi chodzilo ;] pobieranie listy uzytkownikow gdy potrzebuje tylko liste to jedna sprawa i robie podobnie jak proponuje by_ikar.

ja natomiast zastanawiam sie nad pobieraniem danych usera UserManagerem gdy user jest tylko czescia jakiegos obiektu. np wlascicielem zdjecia, wpisu na forum, wiadomosci w poczcie, osoba ktora napisala recenzje itd.

i stad te pytania o wydajnosc i zasadnosc tworzenia nowego UserManagera w funkcjach ktore dobieraja dane usera.
askone
Osobiście zastosowałbym tutaj złączenie w zapytaniu MySQL poprzez inner join. W klasie, w której masz zdefiniowaną metodę pobierającą listę ostatnich 10 dodanych zdjęć pobierz od razu wszystkie dane, łącznie z danymi o użytkowniku. Skoro dane tę są powiązanie nie widzę problemu aby pobrać je jednym zapytaniem z wykorzystaniem złączenia.
by_ikar
Jeżeli dobrze zrozumiałem, to w tych przypadkach IMO nie potrzebujesz ani obiektu menagera ani obiektu usera. Tylko do tych przykładowo fotek, tworzysz osobny obiekt, i w tym obiekcie pobierasz informacje zarówno o zdjęciu jak i autorze zdjęcia (dane z bazy) jeżeli są w osobnych tabelkach to je łączysz. To jest tak samo jak z listą użytkowników. Masz sobie listę fotek, i przy każdej fotce masz login/email autora, a fotek chcesz mieć X na stronie, to będziesz do każdej fotki za każdym razem tworzyć nowy obiekt usera i wypełniał go danymi? No raczej nie, bo wtedy masz dodatkowe, zbędne zapytania. Fotki plus autor fotek powinny być pobierane jednym zapytaniem (z joinem).
DBR
dzieki wielkie, wyjasnilo mi to troche, bo chyba zapedzilem sie troche w slepa uliczke gdzie na sile chcialem wciskac tego managera i pobierac nim rozne obiekty gdy wydajniej mozna to zrobic jednym zapytaniem i obrabianiem tego na poziomie tego samego zrodlowego obiektu.
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.