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:
class Application_Model_Book { protected $_title; protected $_id; { $this->setOptions($options); } } public function __set($name, $value) { $method = 'set' . $name; if (('mapper' == $name) || !method_exists($this, $method)) { throw new Exception('Invalid book property'); } $this->$method($value); } public function __get($name) { $method = 'get' . $name; if (('mapper' == $name) || !method_exists($this, $method)) { throw new Exception('Invalid book property'); } return $this->$method(); } { $methods = get_class_methods($this); foreach ($options as $key => $value) { $this->$method($value); } } return $this; } public function setTitle($text) { $this->_title = (string) $text; return $this; } public function getTitle() { return $this->_title; } public function setId($id) { $this->_id = (int) $id; return $this; } public function getId() { return $this->_id; } }
class Application_Model_BookMapper { protected $_dbTable; public function setDbTable($dbTable) { $dbTable = new $dbTable(); } if (!$dbTable instanceof Zend_Db_Table_Abstract) { throw new Exception('Invalid table data gateway provided'); } $this->_dbTable = $dbTable; return $this; } public function getDbTable() { if (null === $this->_dbTable) { $this->setDbTable('Application_Model_DbTable_Book'); } return $this->_dbTable; } public function save(Application_Model_Book $book) { 'title' => $book->getTitle(), ); if (null === ($id = $book->getId())) { $this->getDbTable()->insert($data); } else { } } public function find($id, Application_Model_Book $book) { $result = $this->getDbTable()->find($id); return; } $row = $result->current(); $book->setId($row->id) ->setTitle($row->title); } public function fetchAll() { $resultSet = $this->getDbTable()->fetchAll(); foreach ($resultSet as $row) { $entry = new Application_Model_Book(); $entry->setId($row->id) ->setTitle($row->title); $entries[] = $entry; } return $entries; } }
class BookController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ } public function indexAction() { $book = new Application_Model_BookMapper(); $this->view->entries = $book->fetchAll(); } }
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!