Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZF][ZendFramework] Bodowa Modelu
markus12
post 18.02.2011, 14:45:37
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 18.02.2011

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


Witam,

większość z was na pewno zna poradnik Quickstart w dokumentacji ZendFrameworka. Jest tam przykład budowy prostej książki gości.

I teraz chciałem zrobić katalog książek w ZF. Mam w bazie tabelki: Book, Author, Book_Author, Book_Genre, itd. Bazując na przykładzie modelu z dokumentacji Quickstart mogę zrobić coś w tym stylu:

  1. class Application_Model_Book
  2. {
  3. protected $_title;
  4. protected $_id;
  5.  
  6. public function __construct(array $options = null)
  7. {
  8. if (is_array($options)) {
  9. $this->setOptions($options);
  10. }
  11. }
  12.  
  13. public function __set($name, $value)
  14. {
  15. $method = 'set' . $name;
  16. if (('mapper' == $name) || !method_exists($this, $method)) {
  17. throw new Exception('Invalid book property');
  18. }
  19. $this->$method($value);
  20. }
  21.  
  22. public function __get($name)
  23. {
  24. $method = 'get' . $name;
  25. if (('mapper' == $name) || !method_exists($this, $method)) {
  26. throw new Exception('Invalid book property');
  27. }
  28. return $this->$method();
  29. }
  30.  
  31. public function setOptions(array $options)
  32. {
  33. $methods = get_class_methods($this);
  34. foreach ($options as $key => $value) {
  35. $method = 'set' . ucfirst($key);
  36. if (in_array($method, $methods)) {
  37. $this->$method($value);
  38. }
  39. }
  40. return $this;
  41. }
  42.  
  43. public function setTitle($text)
  44. {
  45. $this->_title = (string) $text;
  46. return $this;
  47. }
  48.  
  49. public function getTitle()
  50. {
  51. return $this->_title;
  52. }
  53.  
  54. public function setId($id)
  55. {
  56. $this->_id = (int) $id;
  57. return $this;
  58. }
  59.  
  60. public function getId()
  61. {
  62. return $this->_id;
  63. }
  64. }


  1. class Application_Model_BookMapper
  2. {
  3. protected $_dbTable;
  4.  
  5. public function setDbTable($dbTable)
  6. {
  7. if (is_string($dbTable)) {
  8. $dbTable = new $dbTable();
  9. }
  10. if (!$dbTable instanceof Zend_Db_Table_Abstract) {
  11. throw new Exception('Invalid table data gateway provided');
  12. }
  13. $this->_dbTable = $dbTable;
  14. return $this;
  15. }
  16.  
  17. public function getDbTable()
  18. {
  19. if (null === $this->_dbTable) {
  20. $this->setDbTable('Application_Model_DbTable_Book');
  21. }
  22. return $this->_dbTable;
  23. }
  24.  
  25. public function save(Application_Model_Book $book)
  26. {
  27. $data = array(
  28. 'title' => $book->getTitle(),
  29. );
  30.  
  31. if (null === ($id = $book->getId())) {
  32. unset($data['id']);
  33. $this->getDbTable()->insert($data);
  34. } else {
  35. $this->getDbTable()->update($data, array('id = ?' => $id));
  36. }
  37. }
  38.  
  39. public function find($id, Application_Model_Book $book)
  40. {
  41. $result = $this->getDbTable()->find($id);
  42. if (0 == count($result)) {
  43. return;
  44. }
  45. $row = $result->current();
  46. $book->setId($row->id)
  47. ->setTitle($row->title);
  48. }
  49.  
  50. public function fetchAll()
  51. {
  52. $resultSet = $this->getDbTable()->fetchAll();
  53. $entries = array();
  54. foreach ($resultSet as $row) {
  55. $entry = new Application_Model_Book();
  56. $entry->setId($row->id)
  57. ->setTitle($row->title);
  58. $entries[] = $entry;
  59. }
  60. return $entries;
  61. }
  62.  
  63. }


  1. class BookController extends Zend_Controller_Action
  2. {
  3.  
  4. public function init()
  5. {
  6. /* Initialize action controller here */
  7. }
  8.  
  9. public function indexAction()
  10. {
  11. $book = new Application_Model_BookMapper();
  12. $this->view->entries = $book->fetchAll();
  13. }
  14.  
  15. }


To jest w 90% kod z dokumentacji ZF. Ciekawe podejście, jedna klasa do obiektu książki ze zmiennymi takimi jak kolumny w bazie, druga klasa do operacji z bazą, której przesyłamy obiekt tej pierwszej klasy.

To wszystko rozumiem i jest ok. Ale teraz dochodzę do tego, że chciałbym pobrać listę książek wraz z nazwiskami ich autorów, gatunkami do których są przypisane i wyświetlić taką listę np. 20 książek wraz z pełnymi informacjami o każdej. W tej chwili metoda FetchAll wyciąga mi wszystko z tabelki Book. Nie mam pojęcia w jaki sposób podejść do tego, żeby dołączyć do tego też dane z innych tabel.

Tabela Author_Book jest do relacji między książkami i autorami. (czyli książka ma kilku autorów).

Nie wiem jak to ładnie zrobić żeby było zgodne z MVC itd. Czy porzucić całkowicie tej sposób z dwoma klasami czy nie, po prostu proszę o wskazówki w jaki sposób się takie coś robi.

pozdrawiam!
Go to the top of the page
+Quote Post

Posty w temacie


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: 18.07.2025 - 01:56