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 19.03.2007, 12:58:19
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.


--------------------
Michał Płachta
Warsztat: Mac OS X Leopard, PostgreSQL, Text Mate, Retrospectiva + SVN
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
eai
post 31.05.2007, 14:10:14
Post #2





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


Nie ukrywam, temat dość ciekawy.
Nie wiem jednak czy dobrze to zrozumiałem, a nie chce tkwić w błędzie dlatego napisałem:
  1. <?php
  2.  
  3. class Query
  4. {
  5.  public static function Exec ($sql)
  6.  {
  7. if(mysql_connect('localhost','root', 'idesql'))
  8. {
  9.  if(mysql_select_db('test'))
  10.  {
  11.  return new ORM(mysql_query($sql));
  12. }
  13. }
  14. }
  15. }
  16.  
  17. class ORM
  18. {
  19.  private $__dquery = array();
  20.  
  21.  public function __construct($query)
  22.  {
  23.  $this->__dquery = $query;
  24. }
  25.  
  26.  public function select()
  27.  {
  28. if($array = mysql_fetch_assoc($this->__dquery))
  29. {
  30.  return new Data($array);
  31. }
  32.  
  33. return false;
  34. }
  35. }
  36.  
  37. class Data
  38. {
  39.  private $__darray = array();
  40.  
  41.  public function __get($name)
  42.  {
  43. if(empty($this->__darray)) { return false; }
  44.  
  45.  if(array_key_exists($name, $this->__darray))
  46.  {
  47. return $this->__darray[$name];
  48.  }
  49. }
  50.  
  51.  public function __construct($array)
  52.  {
  53.  $this->__darray = $array;
  54. }
  55. }
  56.  
  57.  
  58.  
  59. $table = Query::Exec('SELECT * FROM `tabela`');
  60.  
  61. while($row = $table->select()) {
  62. echo $row->nr . '; ';
  63. echo $row->imie . '; ';
  64. echo $row->nazwisko . ' <br>';
  65. }
  66.  
  67.  
  68. ?>


Jest to oczywiście bardzo prosty przykład, posiadający jedynie możliwośc pobierania wyników.

Moje pytanie brzmi: Czy ide w dobrym kierunku czy kompletnie nie zrozumiałem ORM?
Go to the top of the page
+Quote Post
splatch
post 31.05.2007, 17:40:38
Post #3





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Cytat(eai @ 31.05.2007, 15:10:14 ) *
Moje pytanie brzmi: Czy idę w dobrym kierunku czy kompletnie nie zrozumiałem ORM?


Idziesz w prawie dobrym kierunku. smile.gif
Ideą stosowania mapowań jest wykluczenie klepania SQLa na każdą potrzebę, a w tym momencie, mimo tego, że wynik masz reprezentowany w postaci obiektu, a nie różni się to od:
  1. <?php
  2. $rs = mysql_query($sql);
  3. while ($row = mysql_fetch_object($rs)) {
  4. echo $rs->id .' '. $rs->name .'<br />';
  5. }
  6. ?>


Owszem, umiejętność interpretacji każdego zapytania to cenna funkcjonalność, ale nie zapominaj o tym, że zależy Ci na obiektach jako takich a nie płaskich strukturach pokroju tablicy, a taki efekt uzyskujesz korzystając z __get (zwracasz po prostu kolumnę z wyniku nie zwracając uwagi na to z jakiego obiektu to jest property). Zwróć uwagę, że tu nie ma obiektu. Nie możesz odczytanych wartości zmodyfikować i zapisać.
Obiekt Query może się przydać przy mapowaniu zapytań, ale raczej nie przy ich interpretowaniu.

Kilka przykładów użycia "klasycznego" ORM:
  1. <?php
  2. // Użycie sesji, na podobę Hibernate
  3. // zauważ, że relacje są przeźroczyste
  4. $factory = SessionFactory::build(new PropertiesConfiguration('php-hibernate.ini'));
  5. $session = $factory->getSession();
  6.  
  7. $book = $session->load('Book', 11);
  8. $authors = $book->getAuthors(); // tutaj oczekujemy złączenia po relacji M:N
  9. $book->setTitle('[nakład wyczerpany]' . $book->getTitle());
  10. $book->setAvailable(false);
  11. $authros[0] = new Author('Stanisław', 'Lem');
  12.  
  13. $session->flush(); // wymuszamy zapisanie zmian
  14.  
  15. // uproszczony przykład użycia Table Data Gateway + Row Data Gateway
  16. // relacje M:N są obsługiwane ręcznie
  17. $book = BooksPeer::retrieveByPk(11);
  18. $authors = $book->getAuthors();
  19. $book->setTitle('[nakład wyczerpany]' . $book->getTitle());
  20. $book->setAvailable(false);
  21. // dobieramy się do tabelki pośredniej pomiędzy autorami a książkami
  22. $authros[0]->getProxyForBook(11)->delete();
  23. $authros[0] = new Author('Stanisław', 'Lem');
  24.  
  25. $authros[0]->createProxyForBook(11); // przywiązujemy autora do książki
  26. $book[0]->save(); // ten zapis załatwia nam wszystko
  27. ?>


Pamiętaj, że różnice implementacji przy różnych ORMach są czasami olbrzymie, zawsze możesz znaleźć swoją własną implementację bazując na dostępnych wzorcach.


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 12.06.2024 - 09:15