Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zbyt wiele zapytań?
ayeo
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

Ostrzeżenie: (0%)
-----


Witam!
W ramach próby zrozumienia obiektowego podejścia piszę bazę danych o filmach. Mam kilka wątpliwości. Mam klasę Movie, która zawiera prywatne własności jak: id, tytuł, rok produckji, reżyser, opis, gatunek... Id odpowiada id z bazy danych. Konstruktor na podstawie Id wypełnia obiekt danmi z bazy, jeżeli id nie zostało podane tworzy pusty obiekt, ktory można wypelnic za pomoca metod dostepowych. Jest jeszcze flaga change, a destruktor zapisuje zmiany do bazy jezeli została ustwiona.
Jeżeli wyszukiwarka zwróci powiedzmy 15 pasujących filmów (ich id) to do stworzenia 15 obiektów potrzeba 15 dodatkowych zapytań!! Myślałem o dodatkowej klasie MovieManager, która na podstawie jednego zapytania tworzylaby w petli puste obiekty Movie i wypelniala je danymi z wczesniejszego zapytania.

Proszę o jakieś sugestie!
Go to the top of the page
+Quote Post
Cezar708
post
Post #2





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


tak to jest jedna z wad ORM, że w sumie tak naprawdę musiałbyć mieć tyle zapytań, na szczęście jest rozwiązanie, możesz stworzyć tę swoją klasę MovieManager lub możesz stworzyć statyczną metodę w klasie Movie i za jej pomocą możesz pobierać większe kolekcje danych, poniżej przykład:

  1. <?php
  2. class Movie {
  3. // twoj dotychczasowy kod 
  4. // ..
  5.  
  6. public static function getByPk($arrPk){
  7. $strPk = implode ( "', '", $arrPk );
  8. $sqlSelect = "SELECT * FROM movies WHERE id IN ('$strPk') ";
  9. $arrMovies = dataBase::$db->getAll($sqlSelect);
  10. $arrReturn = array();
  11. foreach ($arrMovies as $movie){
  12. $objMovie = Movie();
  13. $objMovie->setId($movie['id']);
  14. // .. i pozostale pola
  15. $arrReturn[] = $objMovie; 
  16. } 
  17. return $arrReturn;
  18. }
  19.  
  20. }
  21. ?>


aczkolwiek stworzenie klasy MovieManager (lub MovieCollector) jest lepszym i bardziej przejrzystym rozwiązaniem
Go to the top of the page
+Quote Post
ayeo
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

Ostrzeżenie: (0%)
-----


Wielkie dzięki za szybką odpowiedź!
Mam jednak kolejne wątpliwości. Klasa Movie zawiera prywatne własności takie jak tytuł, rok, rezyser, aktorzy, gatunek i opis. Wyszukiwarka umożliwia wyszukanie filmu np po roku produkcji. Załóżmy, że zwraca 20 pasujących produkcji. Nie widzę większego sensu, żeby wypełniać obiekt wszystkimi danymi tylko po to, żeby wyświetlić tytuły,rok i gatunek na liście wyników wyszukiwania. Jak już pisałem dopiero staram się zrozumieć OOP.
Mam taki pomysł, żeby stworzyć klasę powiedzmy EasyMovie, z własnościami: tytuł, rok, gatunek, a dopiero klasa Movie rozszerzałaby ją o dodatkowe. Mówię o dziedziczeniu. Wyszuiwarka (klasa MovieFinder) zwracałaby jako wynik kolekcję (już mam szkic klasy Collection) obiektów EasyMovie.
Pytanie brzmi czy to jest dobre podejście?
Go to the top of the page
+Quote Post
Cezar708
post
Post #4





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


to, co chcesz zastosować fachowo nazywa się leniwą konkretyzacją czyli nie pobierasz danej z bazy tak długo, aż do momentu gdy będzie Ci potrzebna.

więcej na ten temat znajdziesz tu Leniwa konkretyzacja? Jak to ugryźć?, Inicjowanie obiektu wybranymi wartościami
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 19:52