Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MVC] DAO i Model, Oraz relacje w bazie danych
Reigon
post
Post #1





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 19.10.2004

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


Piszac wlasna architekture pod aplikacje internetowe natknalem sie na pewien problem, zreszta, jak to zwykle sie okazuje, nie ja jeden (podobny watek: http://forum.php.pl/index.php?showtopic=44563)

Chodzi o powiazanie warstwy modelu (w modelu MVC) wraz z podwarstwa DAO. W przypadku pojedynczych tabel problemu nie ma, a rozwiazuje to mniej wiecej tak:
W akcji (czy inaczej PageController lub ActionController) uruchamiam kontretna klase DAO i jej metoda wypelnia model danymi i zwraca (w zaleznosci od wynikow - pojedynczy obiekt modelu lub tablice obiektow), mniej wiecej:

  1. <?php
  2. $this->_request = $request;
  3. $db = DBManager::polacz();
  4. $this->_db = $db;
  5. $this->_modeldao = new KlientDao($db);
  6. $klient = $this->_modeldao->szukajKlienta(array('id','imie','nazwisko','id_firmy'),array('id'=>$id));
  7. ?>


W $klient mam model (obiekt) klienta o konkretnym id i jego wlasnosci (id, imie, nazwisko,id_firmy). Moge teraz to latwo przekazac do kontenera, a pozniej wieswietlic dane w widoku.

Tego typu praktyka, ze model jest wypelniany danymi pobranymi z warstwy DAO (lub np. w przypadku formularza dodawania/edycji - od usera), wydaje sie dobra.

W przytoczonym wczesniej watku user Bora opisal swoje wlasne rozwiazanie + zdanie

"Coś takiego powinno ładnie działąć, problem jest dopiero w przypadku powiązań między tabelami. "

No wlasnie, jak sobie radzicie, jezeli klient ma w bazie relacje np. z firma i ten klient kupil jakas rzecz (wiec takze relacje z zakupy - w uproszczeniu ... chociaz to w zakupach jest id klienta) (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Aktualnie robie to tak - tworze nowy obiekt DAO i szukam firmy:

  1. <?php
  2. $this->_modeldao = new FirmaDao($this->_db);
  3. $firma = $this->_modeldao->szukajFirmy(array(),array('id'=>$klient>id_firmy));
  4. ?>


Jest to jakies rozwiazanie w przypadku jednego klienta, ale co w przypadku listy n klientow ? Mamy wtedy n+1 zapytan SQL :/ Oczywiscie mozna stworzyc sobie inna metode w klasie DAO, np.
szukajKlientowiFirmy, gdzie zapytanie byloby oparte na zlaczeniach, ale wtedy jak wydzielic pola i jak tworzyc obiekty. A moze firma w tym wypadku powinna byc tablica asocjacyjna w modelu klienta, a nie osobnym obiektem. Jak Wy to rozwiazujecie, bo przeciez podstawa ?

Niby byla juz podobna dyskusja na tego typu temat http://forum.php.pl/index.php?showtopic=64564&st=0, ale niezbyt byla rowinieta, poza tym, ze mozna skorzystac z Propela....

Ten post edytował Reigon 18.05.2007, 14:37:00
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
Sedziwoj
post
Post #2





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


@Reigon takie powiązanie stanowi osobny model, to chyba powinno rozjaśnić, a jak nie można operować na warstwie bazy to tworzy się coś między co obsługuje.
Np. przy zakupach możesz pobrać wszystkie transakcje, ale też można danego klienta. Można pobrać pojedynczą, aby w danych zwrotnych były jakieś informacje o produktach które były kupione...
Więc przydatny byłby model, który obsługuje transakcje na takim poziomie. A w kontrolerach tworzysz instancje takiego obiektu i korzystasz z jego metod, a w samym modelu decydujesz jak i skąd pobrać dane.
Trzeba tylko pamiętać o tym, aby dany model obsługiwał tylko pewną konkretną rzecz (taki model jest obiektem więc powinien za dużo mieć na głowie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) )
Go to the top of the page
+Quote Post
Reigon
post
Post #3





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 19.10.2004

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


Cytat(Sedziwoj @ 18.05.2007, 17:48:22 ) *
takie powiązanie stanowi osobny model


Dzieki (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) czyli jak chce wyswietlic liste klientow wraz z nazwa firmy, to przydalby sie model, ktory posiada wlasciwosci idKlienta, imie, nazwisko, nazwaFirmy...i tablice takich obiektow przekazuje do widoku...no w sumie niezle rozwiazanie,

Inne jakie wymyslilem, to w przypadku wystapienia zlaczenia kilku tabel wysylanie dosyc malo obciazajacego zapytania 'desc nazwa_tabeli' (tyle razy ile zlaczonych tabel), ktora zwroci liczbe pol w tabeli (w przypadku podania pol wprost obyloby sie bez tego zapytania)...wtedy po po przetworzeniu n-kolumn w wierszu tworzymy obiekt Klient, a pozniej dla kolejnych kolumn obiekt Firma. Oczywiscie zadzialaloby to, gdyby pola z poszczegolnych tabel wystepowaly jedne po drugich (tak jest domyslnie, bez przestawien)

Zastanawiam sie teraz, ktore rozwiazanie byloby lepsze
Jednak w sumie w przypadku wyswietlania typowych list userow nie ma koniecznosci i potrzeby tworzenia dwoch obiektow (Klient i Firma), bo i tak zadne operacje poza wyswietleniem nie beda na nich przeprowadzane. Dlatego porobie osobne modele dla takich przypadkow (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

jeszcze inne (pewnie najlepsze) to zastosowanie Propela - ale ze aplikacja jest juz dosyc zaawansowana, a prace magisterska trzeba konczyc, to moze innym razem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował Reigon 18.05.2007, 19:43:36
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 - 13:25