Zend Framework Object Relation Model Dr Nenad Kojić Marko M Spasojević inž. spec
Uvod Kako obezbediti vezu izmeñu koda i podataka Uvek je bio problem pronaći zajednički jezik izmeñu dva pristupa u opisivanju podataka Interpretacija podataka u bazi podataka Interpretacija podataka u OO jeziku
Zašto ORM? Neslaganje izmeñu objektnog i relacionog modela OO programiranje je zasnovano na nasleñivanju i ekapsulaciji Relacioni model je zasnovan na matematičkim principima- teorija skupova Svaki o ovih pritupa ima svoje prednosti i mane OO model se fokusira na izradu aplikacija preko objekata koji sadrže podatke i akcije (metode) Relacioni model se fokusira skladištenje podataka
Šta je ORM? Object Relation Model Programerska tehnika za konverziju podataka izmeñu nekompatibilnih sistema i OO jezika. Predstavlja sloj veze izmeñu (adapter) strukture baze podataka i objekata u okviru OO napisanog koda.
Mapiranje podataka-datamapper Predstavlja adapter (man in the middle) izmeñu podataka u bazi podataka i objekata u PHP-u tj. Zend Framework-u Omogućava da objekat ne mora da zna odakle podaci dolaze (baza podataka, servis, fajl...) Ovaj pristup čini naš kod veoma skalabilnim Postoje u paketi za automatsko mapiranje podataka kao što je Doctrine
DataMapping u Zend Framework-u Mapiranje podataka je sastavni deo modela Ceo kod koji se tiče mapiranja smešten je u celini models Grubo gledano sastoji se iz 3 koraka 1. Opis tabele preko klase 2. Opis entiteta preko klase 3. Definisanje modela
Opis tabele preko klase Zend_Db_Table_Abstract Klasa izvedena iz klase Zend_Db_Table_Abstract Osobine tabele se opisuju kroz svojstva objekta Kreira se komandom zf create db-table ImeKlase Imetabele Lokacija models/dbtable Neka od osnovnih svojstava su: $_name predstavlja ime tabele u bazi (ako ovoga nema onda se uzima ime klase koje mora biti isto kao u bazi) $_primary definisanje primarnog ključa $_dependenttables definisanje zavisnih tabela (tabele u kojima je neka od kolona strani ključ)
Opis tabele preko klase Zend_Db_Table_Abstract - Primer class Application_Model_DbTable_Galerije extends Zend_Db_Table_Abstract{ protected $_name = 'galerija'; protected $_id='idgalerija'; protected $_dependenttables=array('application_model_ DbTable_Slike');
Opis tabele preko klase Zend_Db_Table_Abstract Mogućnost redefinisanja metoda u specijalnim slučajevima kao na primer unos veze u vezivnu tabelu public function insert(array $data){ if (empty($data['created_on'])) { $data['created_on'] = time(); return parent::insert($data); public function update(array $data, $where){ if (empty($data['updated_on'])) { $data['updated_on'] = time(); return parent::update($data, $where);
Kreiranje modela Kreiranje modela zf create model ImeModela Klasa koja opisuje entitet class Application_Model_Galerija{ protected $_id; protected $_naziv; protected $_slike; public function setid($id){ $this->_id=$id; return $this; public function getid(){ return $this->_id; public function setnaziv($text){ $this->_naziv=$text; return $this; public function getnaziv(){ return $this->_naziv; public function getslike(){ return $this->_slike; public function setslike($slike){ $this->_slike=$slike; return $this;
Kreiranje Mapper-a u modelu Predstavlja klasu (adapter) izmeñu tabele i konkretnog objekta zf create model ImeMapper class Application_Model_GalerijeMapper{ protected $_dbtable; public function setdbtable($dbtable){ if(is_string($dbtable)){$dbtable=new $dbtable(); if(!$dbtable instanceof Zend_Db_Table_Abstract){ throw new Exception("Nepostojeci table geteway"); $this->_dbtable=$dbtable; return $this; public function getdbtable(){ if(null==$this->_dbtable){ $this->setdbtable('application_model_ DbTable_Galerije'); return $this->_dbtable; public function save(application_model_ Galerija $galerija){ $data=array( 'naziv'=>$galerija->getnaziv() ); if(null===($id=$galerija->getid())){ unset($data['id']); $this->getdbtable()->insert($data); else{ $this->getdbtable()-> update($data,array('idgalerija=?'=>$id));...
Mapiranje i definisanje relacija U okviru klase Zend_Db_Table_Abstract Definisanje zavisnosti $_dependenttables=array( Ime_klase_tabele') Definisanje stranog ključa $_referencemap=array( ime_veze'=>array( 'columns'=>array( kolone'), 'reftableclass'=> tabela_sa_primarnim_ključem', 'refcolumns'=>array( primarni_ključ') ), );
Primer relacije Galerija Slika class Galerija extends Zend_Db_Table_Abstract{ protected $_name = 'galerija'; protected $_id='idgalerija'; protected $_dependenttables=array('slika'); class Slika extends Zend_Db_Table_Abstract{ protected $_name = 'slika'; protected $_id='idslika'; protected $_referencemap=array( 'Galerija'=>array( 'columns'=>array('idgalerija'), 'reftableclass'=>'galerija', 'refcolumns'=>array('idgalerija') ), );
Korisnik Uloga Relacija n:n KorisnikUloga class Korisnik extends Zend_Db_Table_Abstract{ protected $_dependenttables=array('korisnikuloga'); class KorisnikUloga extends Zend_Db_Table_Abstract{ protected $_referencemap=array( 'Korisnik'=>array( 'columns'=>array('idkorisnik'), 'reftableclass'=>'korisnik', 'refcolumns'=>array('idkorisnik') ), 'Uloga'=>array( 'columns'=>array('iduloga'), 'reftableclass'=>'uloge', 'refcolumns'=>array('iduloga') ), ); class Uloge extends Zend_Db_Table_Abstract{ protected $_dependenttables=array('korisnikuloga');
Preuzimanje podataka preko relacija Preuzimanje zavisnih redova 1:n $galerijared->finddependentrowset('slike') Galerija Slika Preuzimanje zavisnih redova n:n $korisnikred->findmanytomanyrowset('uloga', 'KorisnikUloga', 'Korisnik')) Korisnik Uloga KorisnikUloga
Primer-dijagram baze podataka
Veza strana - tip strane class Application_Model_DbTable_Strane extends Zend_Db_Table_Abstract{ protected $_dependenttables=array('application_model_dbtable_kategorijastrana', 'Application_Model_DbTable_Komentari'); protected $_referencemap=array( 'TipStrane'=>array( 'columns'=>array('idtipstrane'), ); 'reftableclass'=>'application_model_dbtable_tipstrane', 'refcolumns'=>array('idtipstrane') ), 'Korisnik'=>array( 'columns'=>array('idkorisnik'), 'reftableclass'=>'application_model_dbtable_korisnici', 'refcolumns'=>array('idkorisnik') ), class Application_Model_DbTable_TipStrane extends Zend_Db_Table_Abstract{. protected $_dependenttables=array('application_model_dbtable_strane');...
Veza strana-kategorija_strana-kategorija class Application_Model_DbTable_KategorijaStrana extends Zend_Db_Table_Abstract{ protected $_name = 'kategorija_strana'; protected $_primary='idstrana';//ovo mora ovako u protivnom ne radi dobro protected $_referencemap=array( 'Kategorija'=>array( 'columns'=>array('idkategorija'), 'reftableclass'=>'application_model_dbtable_kategorije', 'refcolumns'=>array('idkategorija') ), 'Strana'=>array( 'columns'=>array('idstrana'), 'reftableclass'=>'application_model_dbtable_strane', 'refcolumns'=>array('idstrana') ), ); class Application_Model_DbTable_Kategorije extends Zend_Db_Table_Abstract{ protected $_name = 'kategorija'; protected $_id='idkategorija'; protected $_dependenttables=array('application_model_dbtable_kategorijastrana');
Toliko za sada!!!
Zend Framework Object Raltion Mapping Dr Nenad Kojić Marko M Spasojević inž. spec