Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zbyt wiele zapytań?
Forum PHP.pl > Forum > PHP > Object-oriented programming
ayeo
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!
Cezar708
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
ayeo
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?
Cezar708
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
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.