2

Ich erstelle eine Anwendung mit Zend Framework und ich möchte das Data-Mapper-Entwurfsmuster für die Verwaltung meiner Datenbank verwenden. Was ich nicht verstehe, ist, wie man das Muster mit einer relationalen Datenbank verwendet.Datamapper DB-Muster mit ZF: Verwalten einer relationalen Datenbank

Angenommen, ich habe eine Tabelle mit Posts mit Spalten ID, Titel, Text und Autor. Ich kann die folgenden Klassen verwenden, um dies zu verwalten:

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); 
} 

Nun nehme ich einen Eins-zu-viele-Beziehung schaffen wollte - Kommentare, zum Beispiel - wie würde ich das tun? Und eine Viele-zu-Viele-Beziehung? - Oder wäre das genauso wie ein Eins-zu-Viele?

Bitte geben Sie, wenn möglich, Codebeispiele in Ihren Antworten an, um mir das Verständnis zu erleichtern.

+0

das ist der Punkt, an dem Sie feststellen, dass es eine mühsame Arbeit ist, einen DataMapper handzukodieren und zu einem ORM zu wechseln, wie Doctrine, das dies für Sie durch die Konfiguration erledigt. – Gordon

+1

Ich würde es gerne selbst machen. Aber wie mache ich das? – moteutsch

+0

Schauen Sie sich die [Object-Relational Patterns] an (http://martinfowler.com/eaaCatalog/index.html) – Gordon

Antwort

2

Wenn Ihre Application_Model_Post-Modelle eine Sammlung von Application_Model_Comments aufweisen, würden Sie im Allgemeinen eine geeignete Db_Table und Mapper für Kommentare einrichten und Ihr Post-Modell in irgendeiner Weise erweitern, um Kommentare für einen bestimmten Beitrag zu erhalten.

Sie können entscheiden, ob die CommentMapper in Ihrem Beitrag Modell zu injizieren:

class Application_Model_Post { 
    protected $_commentMapper; 

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

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

Beachten Sie, dass Ihr Beitrag Modell noch nichts von der Persistenz-Schicht weiß. Alle Details zum Laden von Kommentaren sind in Ihrem CommentMapper zusammengefasst.

+0

Wie würden Sie die 'save' Methode in' Application_Model_PostMapper' einrichten? Vermutlich muss dies auch über den 'commentMapper' bekannt sein - benutzen Sie einfach den im' $ post' übergebenen? – ChrisA

Verwandte Themen