Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasy DAO
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
jafet
Witam serdecznie!

Piszę właśnie prosty framework i zafascynowały mnie obiekty DAO smile.gif Do tego wziąłem se Open Power Driver, który jest świetny do tworzenia tych obiektów.
Ale do rzeczy. Postanowiłem hierarchię klas DAO oprzeć o główną abstrakcyjną klasę, z której inne by dziedziczyły. W tej klasie byłyby metody do wczytywania i kasowania i ... No właśnie, zastanawiam się jak napisać wspólne metody do wstawiania i zmieniania rekordów?questionmark.gif Czy są może jakieś kruczki w OPD, które to wspierająquestionmark.gif? Czy jednak muszę nadpisywać te metody w klasach pochodnych?questionmark.gif

Kod
[php]public function wczytaj($id)
  {
      $stmt = $this -> db -> prepare('SELECT * FROM '.$this->model.' WHERE id = :id');
      $stmt -> bindParam(':id', $id,PDO::PARAM_INT);
      $stmt -> execute();
      $stmt -> setFetchMode(PDO::FETCH_CLASS, $model, array(0 => false));
      $wynik = $stmt -> fetch();
      $stmt -> closeCursor();
      return $wynik;
  }[/php]

To jest uniewersalna metoda do wczytywania klasy i tak się zastanawiam nad sposobami na takie unierwsalne metody do update'ów i insert'ów...

Z góry dzięki za wszelkie przemyślenia.

Tutaj diagram z hierarchią klas: http://www.spoiwo.pl/diagram/Main.jpg
SongoQ
Nie wiem czy CI to pomoze ale zobacz sobie do kodu Cake, tam cos takiego jest zaimplementowane.
Bora
  1. <?php
  2.  
  3.  
  4. class DAO{
  5. protected $db;
  6. protected $model;
  7. protected $id = 0;
  8. protected $data = array();
  9. function __construct($model){
  10. require_once ('includes/ExtendedPDOStatement.class.php');
  11. $this->db = new PDO("mysql:host=localhost;dbname=date", "root", "");
  12. $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  13. $this->db->setAttribute(PDO::ATTR_STATEMENT_CLASS, array("ExtendedPDOStatement"));
  14. $this->model = $model;
  15. }
  16. public function create(){
  17. $this->id = 0;
  18. $sth = $this->db->prepare('SHOW COLUMNS FROM '.$this->model);
  19. $sth->execute();
  20. $data = $sth->fetchAll(PDO::FETCH_ASSOC);
  21. $tables = array();
  22. foreach($data as $value){
  23. if (strtolower(substr($value['Type'], 0, 3)) == 'int'){
  24. $this->data[$value['Field']] = 0;
  25. }else{
  26. $this->data[$value['Field']] = '';
  27. }
  28. }
  29. }
  30. public function load($id){
  31. $this->id = $id;
  32. $sth = $this->db->prepare('SELECT * FROM '.$this->model.' WHERE id = ?');
  33. $sth->bindParam(1, $id, PDO::PARAM_STR);
  34. $sth->execute();
  35. if($data = $sth->fetchSingle(PDO::FETCH_ASSOC)){
  36. $this->data = $data;
  37. }else{
  38. throw new Exception('Object with id: '.$id.' not exist in table '.$this->model.'.');
  39. }
  40. }
  41. public function save(){
  42. if ($this->id > 0){
  43. $data = array();
  44. unset($this->data['version']);
  45. foreach($this->data as $key => $value){
  46. if (is_numeric($value)){
  47. $data[] = $key. '='.$value;
  48. }else{
  49. $data[] = $key. '= ''.$value.''';
  50. }
  51. }
  52. $dataStr = implode(', ', $data);
  53. $sth = $this->db->prepare('UPDATE '.$this->model.' SET version = version + 1 , '.$dataStr.' WHERE id = ?');
  54. $sth->bindParam(1, $this->id, PDO::PARAM_STR);
  55. $sth->execute();
  56. }else{
  57. unset($this->data['version']);
  58. unset($this->data['id']);
  59. $values = array();
  60. foreach($this->data as $key => $value){
  61. if (is_numeric($value)){
  62. $values[] = $value;
  63. }else{
  64. $values[] = '''.$value.''';
  65. }
  66. }
  67. $sth = $this->db->prepare('INSERT INTO `test` (version, '.implode(', ', array_keys($this->data)).') ' .
  68. 'VALUES (0, '. implode(', ', $values) .');');
  69. $sth->bindParam(1, $this->id, PDO::PARAM_STR);
  70. $sth->execute();
  71. }
  72. }
  73. public function __get($name) {
  74. return $this->data[$name];
  75. }
  76.  
  77. public function __set($name, $value) {
  78. if ($name != 'id' && $name != 'version'){
  79. return $this->data[$name] = $value;
  80. }else{
  81. return false;
  82. }
  83. }
  84. }
  85.  
  86. class User extends DAO{
  87. public function __construct(){
  88. parent::__construct('test');
  89. }
  90. }
  91.  
  92. $dao = new User;
  93. $dao->load(2);
  94. $dao->version = 2;
  95. $dao->save();
  96. $dao->create();
  97. $dao->value1='valll1';
  98. $dao->name='inserted';
  99. $dao->save();
  100. ?>

Coś takiego powinno ładnie działąć, problem jest dopiero w przypadku powiązań między tabelami.
jafet
Dzięki wielkie Bora smile.gif O coś takiego właśnie mi chodziło.

Pozdrawiam
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-2024 Invision Power Services, Inc.