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:
class Application_Model_Book
{
protected $_title;
protected $_id;
public function __construct
(array $options = null) {
$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();
}
public function setOptions
(array $options) {
$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 {
$this->getDbTable()->update($data, array('id = ?' => $id)); }
}
public function find($id, Application_Model_Book $book)
{
$result = $this->getDbTable()->find($id);
if (0
== count($result)) { 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!