PHP expert |
|
Een model is een database class die werkt met één tabel. Als je relaties hebt tussen de verschillende tabellen dan heb je ook relaties tussen de modellen. Hiervoor moet je inderdaad een refentieschema maken (zie de documentatie van ZF).
Een illustratie is hierbij niet onhandig . We nemen een klassiek voorbeeld. We maken een forum en deze bevat een aantal topics. Iedere topic kan meerdere reacties hebben. De relatie tussen de tabel topics en zijn onderliggende tabel reacties is 'has many'.
Omdat we met MVC werken maken we dus 2 models aan. Eén voor de tabel topics en één voor de tabel reacties. De relatie is dat één topic meerdere reacties heeft. Je kan nu kiezen hoe je te werk gaat maar een verstandige programmeur/scripter zal al direct zien dat de tabel reacties onder het niveau van de tabel topics staat (*) (zonder topics geen reacties moet je maar denken).
(*) Ook de tabel reacties kan onderliggende tabellen hebben.
Dus in je Reacties model zeg je hoe de tabel reacties afhankelijk is van de topics tabel.
class Topics extends Zend_Db_Table {
protected $_name = "reacties");
}
class Topics extends Zend_Db_Table { protected $_name = "reacties"); }
include_once 'models/Topics.php';
class Reacties extends Zend_Db_Table {
protected $_name = 'topics';
protected $_referenceMap = array( "Reacties" => array(
"columns" => "topic_id" ,
"refTableClass" => "Topics" ,
"refColumns" => "id"
) );
}
include_once 'models/Topics.php'; class Reacties extends Zend_Db_Table { protected $_name = 'topics'; protected $_referenceMap = array( "Reacties" => array( "columns" => "topic_id" , "refTableClass" => "Topics" , "refColumns" => "id" ) ); }
Omdat het model Topics de model Reacties gebruikt moet je die ook includen.
Stel dat er nu een gebruik een topic met ID 123 wilt bekijken. Dan moet je niet met 2 modellen werken maar werk je met de referenceMap van het model Topics.
public function viewAction()
{
$topics = new Topics();
$topic_id = $this->_request->getParam("id"); //$_GET['id']
//haal het topic uit zijn tabel
$topic = $topics->fetchRow("id=" . $topic_id);
//haal de reacties op die bij het topic horen
$reacties = $topic->findDependentRowset('Reacties');
}
public function viewAction() { $topics = new Topics(); $topic_id = $this->_request->getParam("id"); //$_GET['id'] //haal het topic uit zijn tabel $topic = $topics->fetchRow("id=" . $topic_id); //haal de reacties op die bij het topic horen $reacties = $topic->findDependentRowset('Reacties'); }
Door zelf eens te experimenteren en met de functies van ZF te testen ga je zelf inzien dat je hiermee makkelijk relaties kan leggen tussen tabellen (en modellen). |