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
splatch
post 6.07.2007, 07:48:08
Post #4





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

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


Cytat(splatch @ 31.05.2007, 18:40:38 ) *
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.


Wystarczy zajrzeć pod wspomniany adres..

Data Source Architectural Patterns Table Data Gateway, Row Data Gateway, Active Record, Data Mapper.
Object-Relational Structural Patterns Identity Field, Foreign Key Mapping, Association Table Mapping, Dependent Mapping, Embedded Value, Serialized LOB, Single Table Inheritance, Class Table Inheritance, Concrete Table Inheritance, Inheritance Mappers.
Object-Relational Metadata Mapping Patterns Metadata Mapping, Query Object, Repository.


--------------------
Ł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: 11.06.2024 - 21:38