2

Я создаю приложение с использованием Zend Framework, и я хочу использовать шаблон проектирования карт данных для управления моей базой данных. Я не понимаю, как использовать шаблон с реляционной базой данных.Datamapper DB Pattern With ZF: Управление реляционной базой данных

Предположим, у меня есть таблица, содержащая сообщения с столбцами id, title, text и author. Я мог бы использовать следующие классы для управления этим:

class Application_Model_DbTable_Posts extends Zend_Db_Table_Abstract 
{ 
    $_name = 'posts'; 
} 

class Application_Model_PostMapper 
{ 
    public function setDbTable($dbTable); 
    public function getDbTable(); 
    public function save($post); 
    public function find($id); 
    public function fetchAll(); 
} 

class Application_Model_Post 
{ 
    protected $_id; 
    protected $_title; 
    protected $_text; 
    protected $_author; 

    public function __set($name, $value); 
    public function __get($name); 
} 

Теперь предположим, что я хотел, чтобы создать один-ко-многим - комментарии, например, - как бы я это сделать? И отношения многих-ко-многим? - или это будет сделано то же самое, что и один-ко-многим?

Просьба представить образцы кода в ваших ответах, если это возможно, чтобы помочь мне понять.

+0

Это тот момент, когда вы заметили, что очень много утомительной работы по ручной кодировке DataMapper и переключению на ORM, например Doctrine, который делает это для вас через конфигурацию. – Gordon 2010-11-27 17:35:30

+1

Я бы хотел сделать это сам. Но как я это делаю? – moteutsch 2010-11-27 21:04:36

ответ

2

Вообще говоря, если ваши модели Application_Model_Post имеют коллекцию Application_Model_Comments, вы должны создать соответствующие комментарии Db_Table и Mapper для комментариев и каким-то образом расширить свою модель Post, чтобы можно было получать комментарии к определенному сообщению.

Вы можете решить, впрыснуть CommentMapper в сообщение модели:

class Application_Model_Post { 
    protected $_commentMapper; 

    function __construct($commentMapper){ 
     $this->_commentMapper = $commentMapper; 
    } 

    function getComments(){ 
     return $this->_commentMapper->findByPostId($this->getId()); 
    } 
} 

Обратите внимание, что сообщение ваша модель до сих пор ничего не знает о сохранении слоя. Вся информация о загрузке комментариев абстрагируется в вашем CommentMapper.