Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zasady pisania na forum Pro

Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.

> ActiveRecord, ORM
seaquest
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 790
Pomógł: 7
Dołączył: 6.02.2003
Skąd: Polska

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


Na początek po reorganizacji forum chcielibyśmy zaproponować wam temat dotyczący mapowania tabel z baz danych na obiekty w PHP.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Strzałek
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 384
Pomógł: 6
Dołączył: 11.09.2004
Skąd: Grodzisk Mazowiecki

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


To może ja coś skrobnę od siebie, o moich doświadczeniach z ORM, a konkretnie z Doctrine. Obok wcześniej wspominanego Propela jest to jedeno z najpopularniejszych narzędzi tego typu. Doctrine przeciwieństwie do Propela nie generuje żadnego kodu. Oraz właściwie nie uwalnia nas do końca od pisania SQL. Jednak MASYMALNIE go uprasza i przyśpiesza. Mianowicie, w Doctrine definuje się każdą tablę np. tak (przykłady będą z dokumentacji)

  1. <?php
  2.  
  3. class Article
  4. {
  5. public function setTableDefinition()
  6. {
  7. $this->hasColumn('name', 'string');
  8. $this->hasColumn('content', 'string');
  9.  
  10. $this->index('content', array('fields' => 'content',
  11. 'type'  => 'fulltext'));
  12. }
  13. }
  14.  
  15. ?>
  16.  
  17. <?php
  18.  
  19. class Product extends Doctrine_Record
  20. {
  21. public function setTableDefinition()
  22. {
  23. $this->hasColumn('id', 'integer', 4, 'primary');
  24. $this->hasColumn('price', 'decimal', 18, array('min' => 0, 'max' => 1000000));
  25. }
  26. }
  27.  
  28. ?>


W metodzie setUp ustawia się relacje do innych Rekordów (czyli klas "odpowiadających" tabelom w db). Przykładowe wyciąganie z bazy danych wygląda tak:

  1. <?php
  2. $q = new Doctrine_Query();
  3. $q->from('User u')
  4. ->leftJoin('u.Group g')
  5. ->innerJoin('u.Phonenumber p WITH u.id > 3')
  6. ->leftJoin('u.Email e');
  7.  
  8. $users = $q->execute();
  9.  
  10. //używanie danych, przykładowo ilustruje jak to wygląda. Nie wiem jakie są pola w 
    bazie dancyh. 
  11. $users[0] -> name;
  12. $users[0] -> Phonenumber -> number;
  13. ?>


Gdzie zamiast nazw tabel podaje się nazwy rekordów. To jest właśnie DQL - Doctrine Query Language. Zapytanie zostaje parsowane do zwykłego zapytania SQL a następnie zostaje zwrócona tablica z obiektami rekordów wcześniej zadeklarowanych. Wreszcie możemy zapomnieć o babraniu się z wyciąganiem danych zwróconych przez zapytanie. Wystarczy takie zapytanie jak powyżej i mamy wszystko z głowy. Dostajemy tablicę z ładnymi obiektami. DQL dodatkowo oferuje inne możliwości jak np. INDEXBY.

Gdyby jednak okazało się że nie da rady wykonać zapytanie przez DQL. Mamy wtedy 2 możliwości. Użyć Doctrine_RawSql, gdzie piszemy właściwie normalne zapytanie, a na końcu podpinamy obiekty. Albo możemy po prostu z Doctrine wziąć obiekt PDO i użyć go jak za starych (dobrych) czasów (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Ja jak narazie tylko raz użyłem RawSql, a PDO? Szczerze to już nie pamiętam jak się z tego korzysta (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Tyle jeżeli chodzi o wyciąganie. Tworzenie i update rekordów jest również banalny i oczywiście odbywa się przez obiekty rekordu. Dodatkowo Doctrine posiada kilka pluginów które są naprawdę bardzo użyteczne i przydatne. Po więcej informacji odsyłam do dokumentacji.

Zaraz padną głosy że doctrine to krowa. Owszem, trochę to wszystko waży. Jeżeli chodzi jednak o wydajność nie poczułem żadnych niedogodności, więc to wszystko mi odpowiada (kolega mówił że jeden projekt składający się z 35 tabel napisał na doctrine (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . Projekt się szybko rozwija. Autorzy zapowiadają że niedługo pojawi się nowa wersja z nowym parserem DQL, który ma być szybszy, chyba ma posiadać nawet jakieś nowe możliwości.

Generalnie, polecam Doctrine. Warto zainteresować się tym ORM.
Go to the top of the page
+Quote Post

Posty w temacie
- seaquest   ActiveRecord, ORM   19.03.2007, 12:58:19
- - Sh4dow   czy czegos podobnego nie robi propel ? Bardzo ciek...   19.03.2007, 13:36:04
- - athabus   Moje doświadczenia z klasami tego typu są dość mał...   19.03.2007, 14:02:56
|- - mike_mech   Cytat(athabus @ 19.03.2007, 14:02:56 ...   19.03.2007, 14:15:21
|- - Yacho   Cytat(athabus @ 19.03.2007, 15:02:56 ...   14.05.2007, 18:00:11
- - Sh4dow   Nie znam framework'a zend'a ale propel dzi...   19.03.2007, 14:12:36
- - athabus   Propela jeszcze nie próbowałem, ale z przykładów, ...   19.03.2007, 14:30:13
- - splatch   Cytat(Sh4dow @ 19.03.2007, 13:36:04 )...   19.03.2007, 23:18:38
- - ActivePlayer   A ja sobie napisałem swoją klasę (swego czasu opis...   20.03.2007, 00:09:17
- - nospor   Ja mam podobnie (tak mi sie wydaje) jak ActivePlay...   20.03.2007, 08:13:36
- - Sh4dow   No to robisz prawie tak samo jak propel, Tylko ze ...   21.03.2007, 10:18:24
- - nospor   CytatJedyne co mnie martwi to wydajność której chy...   25.03.2007, 20:14:56
- - splatch   Pragnę nadmienić, że w przypadku Propela nie trzeb...   27.03.2007, 21:59:00
- - Sedziwoj   Może się wyda dziwne pytanie, ale czy obiekt nie m...   28.03.2007, 00:25:53
|- - splatch   Cytat(Sedziwoj @ 28.03.2007, 01:25:53...   31.03.2007, 11:03:35
- - Hacker   Eeeee... @Sedziwoj czy mi się zdaje czy mówisz o l...   29.03.2007, 18:43:47
- - Sedziwoj   Ja piszę to co myślę, tak kochane 'wzorce proj...   29.03.2007, 23:11:06
- - pawel_k   @splatch - nie do konca dobry przyklad pobierajac ...   26.04.2007, 14:16:59
- - cicik   Mnie przed ORMami odstrasza jedna rzecz. Jeżeli ma...   27.04.2007, 09:15:45
|- - g00fy   Cytat(cicik @ 27.04.2007, 08:15:45 ) ...   21.07.2007, 23:55:44
- - athabus   Nie wiem jak to jest w innych ORM'ach ale właś...   27.04.2007, 10:09:51
- - dr_bonzo   Nie, chocby w Railsach masz :include => 'gr...   27.04.2007, 10:10:38
- - athabus   Yacho nie dość, że cytujesz moją wypowiedź sprzed ...   14.05.2007, 21:27:35
- - Sokal   Myślę sobie teraz o ORM... Według ...   23.05.2007, 17:57:58
- - menic   Jestes w błedzie Misiu (a moze pingwinku;) ) Złozo...   23.05.2007, 18:05:32
- - Sokal   A co powiesz na to, że piszesz jaką...   23.05.2007, 18:11:20
- - bela   Cytat// I jeszcze jeden argument: Przez ORM kod ap...   23.05.2007, 19:22:15
- - menic   No to zaczynamy: Sam AR moze i jest trudniejszy i ...   23.05.2007, 19:31:18
- - Sokal   Dla mnie to zawsze będzie niewygnodne, co z tego, ...   23.05.2007, 20:04:59
|- - splatch   Cytat(Sokal @ 23.05.2007, 21:04:59 ) ...   24.05.2007, 12:04:35
- - menic   Co z tego? Np. to ze nie musisz pamietac nazw wszy...   23.05.2007, 20:07:08
- - webik   Witam Ot dorzuce swoje 3 grosze.... Osobiście uży...   24.05.2007, 00:19:43
- - mike   ~Sokal a dlaczego uważasz że ORM jest dl...   24.05.2007, 11:52:32
- - athabus   splatch ty jakiś agresywny ostatnio jesteś Sok...   26.05.2007, 18:27:32
- - eai   Nie ukrywam, temat dość ciekawy. Nie wiem jednak ...   31.05.2007, 14:10:14
|- - splatch   Cytat(eai @ 31.05.2007, 15:10:14 ) Mo...   31.05.2007, 17:40:38
|- - splatch   Cytat(splatch @ 31.05.2007, 18:40:38 ...   6.07.2007, 07:48:08
- - nasty   Witam, Chciałbym się odnieść do wypowiedzi paru os...   2.06.2007, 13:28:42
- - Sokal   Chyba mnie przekonaliście do ORM-a Propel je...   12.06.2007, 17:33:19
- - Martio   Jakie znacie lub macie u siebie zaimplementowane s...   6.07.2007, 01:05:47
- - SongoQ   Takie cos jest w ORMach zaimplementowane. Patrz np...   6.07.2007, 01:15:01
- - NuLL   lub w phpDoctrine   6.07.2007, 01:17:38
- - XvZOK   A jak Propel radzi sobie z dziedziczeniem w klasac...   30.07.2007, 15:53:15
|- - Sedziwoj   Cytat(XvZOK @ 30.07.2007, 16:53:15 ) ...   31.07.2007, 18:56:32
|- - splatch   Cytat(XvZOK @ 30.07.2007, 16:53:15 ) ...   31.07.2007, 20:14:53
- - XvZOK   Ponownie wróciłem do tematu. Widzę, że tutaj nie z...   27.11.2007, 00:15:41
- - athabus   Myślę, że o widoku nikt nie wspomniał, bo temat ni...   27.11.2007, 10:59:33
- - splatch   Kwestia ORM i widoku nie wiąże się ...   27.11.2007, 11:55:44
- - Martio   Używam Zend Frameworka. Chciałbym oddzielić warstw...   26.02.2008, 00:54:43
|- - Martio   Cytat(Martio @ 26.02.2008, 02:54:43 )...   28.02.2008, 18:36:04
- - regis87   Testowałem różne dostępne rozwiązania ORM, najlepi...   26.02.2008, 20:05:52
- - Sedziwoj   @regis87 I moim zdanie się mylisz, jak jest duży ...   27.02.2008, 10:37:16
- - Cysiaczek   W 100% popieram. Za całą obiektową otoczką takiego...   27.02.2008, 10:52:09
- - splatch   Może w kwestii dużych projektów. Panowie nie zapom...   27.02.2008, 12:09:19
- - regis87   Może źle to ująłem. Mówiąc o dużych projektach nie...   27.02.2008, 17:22:42
- - Cysiaczek   W przypadku Propela masz kilka plików + te, które ...   27.02.2008, 17:27:41
- - regis87   Nie potrafię tego oszacować. Ale kiedy wydajność s...   27.02.2008, 17:55:22
- - Cysiaczek   Jeśli dysponujesz dedykowanym serwerem, to moim zd...   28.02.2008, 00:47:10
- - menic   @up: TAK   28.02.2008, 18:40:32
- - regis87   Skończyłem testy, pork.dbObject. Jest im...   2.03.2008, 22:49:39
- - Strzałek   To może ja coś skrobnę od siebie, o moich doświadc...   14.03.2008, 23:52:02
- - Sedziwoj   Cytat$users[0] -> Phonenumber -> number...   15.03.2008, 08:49:26
- - Strzałek   CytatCzyli mam rozumieć, że on korzysta z stdClass...   15.03.2008, 11:33:06
- - athabus   Doctrine nie używałem więc trudno mi porównać pros...   15.03.2008, 12:31:26
- - Cysiaczek   Nie używałem Doctrine, ale Propela owszem i rzeczy...   15.03.2008, 13:16:35
- - athabus   No niestety sama wydajnośc propel to nie do końca ...   15.03.2008, 13:28:09
- - destroyerr   Więc Doctrine ma możliwość definiowania schematu w...   15.03.2008, 13:37:16
- - splatch   Jeśli idzie o szybkość Propela w wersjach <= 1....   15.03.2008, 14:25:39
- - Sedziwoj   Do tego skomplikowane zapytania można oprzeć na wi...   15.03.2008, 17:42:22
- - Strzałek   CytatWadą, którą widzę w Doctrine j...   15.03.2008, 18:28:52
- - Sedziwoj   @Strzałek tylko powiedz w czym to jest lepsze od P...   15.03.2008, 19:49:46
- - Cysiaczek   Uh, jak mówiłem - nie używałem Doctrine. Jak jest ...   15.03.2008, 20:26:32
|- - Sedziwoj   Cytat(Cysiaczek @ 15.03.2008, 20:26:3...   15.03.2008, 21:21:59
- - Cysiaczek   Oj tam Mi podpowiadanie składni w eclipse działa...   15.03.2008, 22:22:26
- - Sedziwoj   Cytat(Cysiaczek @ 15.03.2008, 22:22:2...   16.03.2008, 00:33:42


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: 4.10.2025 - 17:34