Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
Je débute avec Zend_Db et je nage un peu. En effet j'aimerais avoir un objet model $user qui comporte les proprietes de ma table user et un objet lieu correspondant à une table d'association user_lieu.
La BDD est :
user (id, nom, grade)
user_Lieu (id_user,id_lieu)
lieu (id,nom)
Comment créer l'objet pour avoir ces infos ? il faut surcherger Zend_table ou zend_row et de quelle façon ?
Avec cet objet user j'aimerai par exemple ajouter un lieu à mon user comme cela : $user->lieu->insert(array("nom"=>blabla));
Modifier une propriete comme ceci : $user->nom('toto')->save();
parcourir les lieux comme ca : $user->lieu->fetch(){ echo $user->lieu->current()->name }
supprimer un lieu $user->lieu->find(1)->delete()
J'avous que je vois pas trop comment faire avec Zend_DB_Table et Zend_DB_Row et rowset...
Quelqu'un a t'il une piste.
Merci d'avance.
Hors ligne
Moimeme a écrit:
Bonjour à tous,
Je débute avec Zend_Db et je nage un peu. En effet j'aimerais avoir un objet model $user qui comporte les proprietes de ma table user et un objet lieu correspondant à une table d'association user_lieu.
La BDD est :
user (id, nom, grade)
user_Lieu (id_user,id_lieu)
lieu (id,nom)
Comment créer l'objet pour avoir ces infos ? il faut surcherger Zend_table ou zend_row et de quelle façon ?
Avec cet objet user j'aimerai par exemple ajouter un lieu à mon user comme cela : $user->lieu->insert(array("nom"=>blabla));
Modifier une propriete comme ceci : $user->nom('toto')->save();
parcourir les lieux comme ca : $user->lieu->fetch(){ echo $user->lieu->current()->name }
supprimer un lieu $user->lieu->find(1)->delete()
J'avous que je vois pas trop comment faire avec Zend_DB_Table et Zend_DB_Row et rowset...
Quelqu'un a t'il une piste.
Merci d'avance.
les deux mon général
en fait tu veux pouvoir manipuler un user mais pour cela tu à aussi besoin de manipuler la collection des utilisateur
si tu dérive la classe Zend_Db_Table en User_Table tu pourras rechercher tes user dans la collection en ajouter ou en supprimer. bref cette classe est en quelque sorte le gisement d'utilisateur
en dérivant Zend_Db_Row en User ou User_Row tu vas pouvoir manipuler un utilisateur.
ce qu'il faut comprendre c'est que lorsque tu récupère un utilisateur ainsi il garde son lien avec sa table. et donc tu peux mettre dans la classe en question une méthode add ou update qui va replacer l'utilisateur dans la base.
pareil avec tes lieux et ta collection de lieux.
de la même façon tu vas pouvoir ajouter à ton user une méthode pour récupérer les lieux avec lesquels il est en relation.
Class Adm_Model_User_Table extends Zend_Db_Table { /** * The table name. * * @var string */ protected $_name = 'user'; /** * Classname for row * * @var string */ protected $_rowClass = 'Adm_Model_User_Row'; /** * Constructor. * * Supported params for $config are: * - db = user-supplied instance of database connector, * or key name of registry instance. * - name = table name. * - primary = string or array of primary key(s). * - rowClass = row class name. * - rowsetClass = rowset class name. * - referenceMap = array structure to declare relationship * to parent tables. * - dependentTables = array of child tables. * - metadataCache = cache for information from adapter describeTable(). * * @param mixed $config Array of user-specified config options, or just the Db Adapter. * @return void * @throw Zend_Exception_Db */ public function __construct($config = array()) { parent::__construct($config); if (null == $this->_rowClass) throw new Zend_Exception_Db('$_rowClass non défini'); if (null == $this->_name) throw new Zend_Exception_Db('$_name non défini'); } /** * Make new row associated to this table. * * @param StdClass|array $obj OPTIONAL object to cast * @return Zend_Db_Row */ public function newRow($obj = null) { // voir $this->createRow(array) $row = new $this->_rowClass($obj); $row->setTable($this); return $row; } /** * Select a row by primary key. * * @param integer $id value of primary key * @return Zend_Db_Row */ public function getById($id) { $rows = $this->find($id); return $rows->current(); } /** * Delete a row by primary key. * * @param integer $id value of primary key * @return integer the response of sql server */ public function deleteById($id) { $res = parent::delete($this->_primary[1].' = '.$id); return $res; } /** * Update a row by primary key. * * @param array $data row value to update need to define $data[primary_key' * @return integer the response of sql server * @throw Zend_Exception_Db */ public function UpdateById($data) { if (!isset($data[$this->_primary[1]])) throw new Zend_Exception_Db('Udate data by primary key without primary key.'); $res = parent::update($data, $this->_primary[1].' = '.$data[$this->_primary[1]]); if (preg_match('/mysql/i', get_class($this->_db))) { if ($res <= 0) $res++; } return $res; } /** * Insert a row * * @param array $data row value to insert * @return integer the response of sql server */ public function insert(array $data) { if (!$data[$this->_primary[1]]) unset($data[$this->_primary[1]]); $res = parent::insert($data); return $res; } }
class Adm_Model_User_Row extends Zend_Db_Row { public $data = array();//mettre ici les champs avec les valeur par défaut si besoin public function __construct($object = null) { if (null != $object) { if ($object instanceof StdClass) { $object = get_object_vars($object); } elseif (is_array($object)&&($object['table'] instanceof Zend_Db_Table)) { $this->table = $object['table']; $object = $object['data']; } foreach ($object as $key=>$value) { $this->data[$key] = $value; } } } public function setTable($table) { $this->table = $table; } public function add() { if (!$this->table instanceof Zend_Db_Table) { Zend_Loader::loadClass('Zend_Exception_Db'); throw new Zend_Exception_Db('Table indéfinie pour enregistrer l\'objet'); } return $this->table->insert($this->data); } public function update() { if (!$this->table instanceof Zend_Db_Table) { Zend_Loader::loadClass('Zend_Exception_Db'); throw new Zend_Exception_Db('Table indéfinie pour enregistrer l\'objet'); } return $this->table->UpdateById($this->data); } public function toStdClass() { return (object) $this->data; } public function __get($key) { if (isset($this->data[$key])) { return $this->data[$key]; } else { Zend_Loader::loadClass('Zend_Exception_Db'); throw new Zend_Exception_Db('Row\'s key "' . $key . '" does not exist'); } } }
pour obtenir un utilisateur de ta table user tu appelle getById libre à toi d'ajouter les méthodes dont tu as besoin sur la collection
lorsque tu as un User et que tu veux le mettre à jour tu appelle $user->update();
si tu veux un nouvel utilisateur tu demande à ta collection de t'en préparer un avec newRow tu le remplie et tu fais un $user->add()
A+JYT
Hors ligne
Ca commence a venir merci pour ses explications.
Mais j'ai encore du mal, si je fait une methode checkOne qui recupere un user :
class Users extends Zend_Db_Table{ public function checkOne ($id){ $user = new stdClass(); $user->row = $this->fetchRow($id); Zend_Loader::loadClass("Lieux"); $objLieu = new Lieux(); $user->lieux = $objLieu->fetchAll("user_id =".$id); return $user; } } $tableUser = new Users(); $unUser = $tableUser->checkOne(1);
Si j'ai bien tout pigé j'aurais :
si je veux voir les champs de mon user : $unUser->row->login, $unUser->row->pass ...
pour modifier mon user : $unUser->row->login= 'toto'; $unUser->row->save();
si je veux voir les lieux du user foreach($unUser->lieux as $value) ...
En revanche pour ajouter un lieu, en supprimer en modifier à mon user ? je peux pas faire un $unUser->lieux->insert(array()); Que faire ?
De plus la c'est un cas plutot simple mais si le user est lié a une table ville ville(id_ville,nomVille) avec un id_ville dan sla table user.
le fetchRow me renverra pas la jointure et donc pas le nom de la ville. Comment puis je faire alors pour pouvoir avoir le nom de la ville dans mon objet comme ceci ? $unUser->row->nomVille
Dernière modification par Moimeme (24-10-2007 15:31:31)
Hors ligne
Moimeme a écrit:
Ca commence a venir merci pour ses explications.
Mais j'ai encore du mal, si je fait une methode checkOne qui recupere un user :Code:
class Users extends Zend_Db_Table{ public function checkOne ($id){ $user = new stdClass(); $user->row = $this->fetchRow($id); Zend_Loader::loadClass("Lieux"); $objLieu = new Lieux(); $user->lieux = $objLieu->fetchAll("user_id =".$id); return $user; } } $tableUser = new Users(); $unUser = $tableUser->checkOne(1);Si j'ai bien tout pigé j'aurais :
si je veux voir les champs de mon user : $unUser->row->login, $unUser->row->pass ...
pour modifier mon user : $unUser->row->login= 'toto'; $unUser->row->save();
si je veux voir les lieux du user foreach($unUser->lieux as $value) ...
En revanche pour ajouter un lieu, en supprimer en modifier à mon user ? je peux pas faire un $unUser->lieux->insert(array()); Que faire ?
De plus la c'est un cas plutot simple mais si le user est lié a une table ville ville(id_ville,nomVille) avec un id_ville dan sla table user.
le fetchRow me renverra pas la jointure et donc pas le nom de la ville. Comment puis je faire alors pour pouvoir avoir le nom de la ville dans mon objet comme ceci ? $unUser->row->nomVille
Je te conseille d'associer ta classe User_Table à ta table ainsi
class User_Table extends Zend_Db_Table{ protected $_name = 'user';
ainsi pour récupérer ton utilisateur tu fais simplement
$userTable = new User_Table(); $user = $userTable->find($id);
pour que $user soit un objet tu le déclare simplement dans la table
class User extends Zend_Db_Row{} class User_Table extends Zend_Db_Table{ protected $_name = 'user'; protected $_rowClass = 'User';
lorsque tu fais
$userTable = new User_Table(); $user = $userTable->find($id);
tu as un objet et tu peux faire
$user->login;
tu fais pareil avec les lieux
pour avoir un user avec ses lieux directement tu définis la relation et tu l'utilise
class Lieu extends Zend_Db_Row{} class Lieu_Table extends Zend_Db_Table{ protected $_name = 'lieu'; protected $_rowClass = 'Lieu_Table'; } //la relation class Lieu_Table extends Zend_Db_Table{ protected $_name = 'user_lieu'; protected $_referenceMap = array( 'Lieu_Table' => array( 'columns' => array('id_lieu'), 'refTableClass' => 'Lieu_Table', 'refColumns' => array('id_lieu') ), 'User_Table' => array( 'columns' => array('id_user'), 'refTableClass' => 'User_Table', 'refColumns' => array('id_user') ) ); } class User extends Zend_Db_Row{} class User_Table extends Zend_Db_Table{ protected $_name = 'user'; protected $_rowClass = 'User'; protected $_dependentTables = array('Lieu_Table'); public function getCompleteUser($id) { $user = $this->find($id); $user->lieux = $user->findManyToManyRowset('Lieu', 'Lieu_Table'); return $user; } }
mais si tu ne manipule pas toujours les lieux de tes users le mieux est de le faire au besoin
class Lieu extends Zend_Db_Row{} class Lieu_Table extends Zend_Db_Table{ protected $_name = 'lieu'; protected $_rowClass = 'Lieu_Table'; } //la relation class Lieu_Table extends Zend_Db_Table{ protected $_name = 'user_lieu'; protected $_referenceMap = array( 'Lieu_Table' => array( 'columns' => array('id_lieu'), 'refTableClass' => 'Lieu_Table', 'refColumns' => array('id_lieu') ), 'User_Table' => array( 'columns' => array('id_user'), 'refTableClass' => 'User_Table', 'refColumns' => array('id_user') ) ); } class User extends Zend_Db_Row{ public function getlieux() { return this->findManyToManyRowset('Lieu', 'Lieu_Table'); } } class User_Table extends Zend_Db_Table{ protected $_name = 'user'; protected $_rowClass = 'User'; protected $_dependentTables = array('Lieu_Table'); }
c'est tous l'avantage de dériver à la fois Db_Table et Db_Row
une fois que tu as tes différentes classes il n'est pas très compliqué de choisir la bonne pour faire les méthodes manquantes. je te conseille de lire la doc de ZF il y a beaucoup de chose sur le sujet.
A+JYT
Dernière modification par sekaijin (24-10-2007 18:38:00)
Hors ligne
ok merci je vais gratter dans cette direction
Hors ligne
Aprés avoir etudier la doc un peu plus en profondeur apparement si j'ai bien tout pigé il n'est plus necessaire de faire 2 class dérivant de table d'une part et de row d'autre part.
Maintenant avec Zend_Db_Table_Abstract qui est une couche d'abstraction pour row, rowset et table il suffit juste de dériver de Zend_Db_Table_Abstract et du coup on accède à tout les fetch..., find et compagnie.
Hors ligne