Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Hybrid Data Object
Forum PHP.pl > Forum > PHP > Object-oriented programming
M4chu
Witam, troche zainspirowany tematem psa, postanowiłem napisać własne "coś" do obsługi bazy danych. Narazie nazwałem to tak jak w topicu (od Hybrid - moj hmm framework? w kazdym razie coś w tym stylu, niestety też jeszcze teoria winksmiley.jpg) Jeszcze nie implementowałem tego, ale mam czysto teoretyczny przykład użycia:
  1. <?php
  2.  
  3. // nowe polaczenie
  4.  
  5. $connection = new HDOConnection('mysql://user:password@host');
  6.  
  7. // baza danych
  8.  
  9. if(!$connection->databaseExists('magazine')) {
  10. $magazine = $connection->createDatabase('magazine');
  11. } else {
  12. $magazine = $connection->table('magazine');
  13. }
  14.  
  15. // tabela
  16.  
  17. if(!$magazine->tableExists('articles')) {
  18. $articles = $magazine->createTable('articles');
  19. $articles->addColumn('id', 'integer', 10);
  20. $articles->addColumn('author', 'string', 50);
  21. $articles->addColumn('title', 'string', 50);
  22. $magazine->updateTable($articles);
  23. } else {
  24. $articles = $magazine->table('articles');
  25. }
  26.  
  27. // nowy rekord
  28.  
  29. $article = $articles->createRecord();
  30. $article->setAuthor('Autor');
  31. $article->setTitle('Tytuł');
  32. $articles->updateRecord($article);
  33. // lub
  34. $articles->insertRecord('', 'Autor', 'Tytuł');
  35.  
  36. // zmiana kilku rekordow
  37.  
  38. $c = new Criteria('id', 10, '<');
  39. foreach($articles->selectRecords($c) as $record) {
  40. $record->setId($record->getId() + 10); // za pomoca __get i __set z HDORecord::attributes na podstawie struktury tabeli (np zserializowanej dla wydajnosci)
  41. $articles->updateRecord($record);
  42. }
  43.  
  44. // i usuniecie
  45.  
  46. foreach($articles->selectRecords($c) as $record) {
  47. $articles->deleteRecord($record);
  48. }
  49.  
  50. ?>

Cóż, czekam na jakikolwiek odzew, szczególnie opinie, no i czy ktoś by tego wogóle używał smile.gif Aha no i system jest skierowany raczej dla mniejszych aplikacji i mniej zaawansowanych użytkowników. Bardziej wymagający pewnie wezmą Propela winksmiley.jpg
Vengeance
Ja osobiście robie tak iż sterownik DB ma tylko wykonywać odpowiednie funkcje (mysql_*, sqlite_*) i ewentualnie wspomagać escapeowanie danych etc.

Wszystkie zaś zapytania trzymam w jednym miejscu, gdzie w razie konieczności wystarczy je pozamieniać na odpowiednie dla danej bazy danych.

Twój przykład oczywiście jest ciekawy - ale dla mnie to za duży stopień abstrakcji. Dla mnie nie przydatny, ale może dla innych? :]

Na pewno pisząc to czegoś ciekawego i nowego się nauczysz!
splatch
createTable() - moim zdaniem pomyłka - podobnie tableExists - po co tworzyć dodatkowe zapytania? Jeśli już createTable($columns_and_indexes).

Widzę, że korzystasz z obiektów, które reprezentują dane - zatem czy nie lepiej użyć new Author niż $authors->newRecord()?

Jestem ciekawy jak planujesz rozwiązać problem z kluczami obcymi smile.gif. Widzę również, że sopdobała Ci się Criteria.

Warto się zastanowić nad deleteRecords(Criteria $c) a nie deleteRecord($record). Ogólnie chyba wygodniej byłoby określić jakąś klasę bazową - podobnie jak w propelu BasePeer, następnie AuthorPeer i na końcu Author. Taka budowa centralizuje część zadań.

No i tak na końcu - nie wiem czemu unikacie Propela, przecież to bardzo wygodne narzędzie...
M4chu
Czemu tableExists, to pomylka?
Nie ma 'new Author', bo chcę uniknąć mapowania i tworzenia klas - user ładuje biblioteke i już może sam pracować na danych. Criteria oczywiscie sie spodobala, bo narazie nie widze innego sposobu do budowania... kryteriow winksmiley.jpg Co do masowego edytowania/usuwanie, to tez o tym myslalem, i pewnie tak zrobie - doDelete(Criteria $c), doUpdate(Criteria $c).
Ogolnie to chcialem zrobic takie wygodne narzedzie do np prostego edytowania tabel - zakrywania zapytan ALTER TABLE, szybkiego wybierania rekordów.
Vengeance: wiadomo, pisze dla wlasnej przyjemnosci i pewnie na mojej tylko sie skonczy smile.gif
matid
Cytat(splatch @ 2005-09-22 09:13:32)
No i tak na końcu - nie wiem czemu unikacie Propela, przecież to bardzo wygodne narzędzie...

Było by super wygodne, powiem więcej - prawie niezastąpione, gdyby nie wymagało phinga. IMO z tego powodu staje się bardziej kłopotliwe.

PS. Wiem, że Phing nie jest potrzebny do pracy aplikacji, a tylko do wygenerowania kodu, ale IMO można by to zrobić samym php.
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.