Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-10-2007 11:54:46

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Objet et BDD

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

 

#2 24-10-2007 14:27:56

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Objet et BDD

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 big_smile
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.

Code:

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

Code:

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

 

#3 24-10-2007 15:16:43

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: Objet et BDD

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

Dernière modification par Moimeme (24-10-2007 15:31:31)

Hors ligne

 

#4 24-10-2007 18:32:25

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Objet et BDD

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

Code:

class User_Table extends Zend_Db_Table{
protected $_name = 'user';

ainsi pour récupérer ton utilisateur tu fais simplement

Code:

$userTable = new User_Table();
$user = $userTable->find($id);

pour que $user soit un objet tu le déclare simplement dans la table

Code:

class User extends Zend_Db_Row{}
class User_Table extends Zend_Db_Table{
protected $_name = 'user';
protected $_rowClass = 'User';

lorsque tu fais

Code:

$userTable = new User_Table();
$user = $userTable->find($id);

tu as un objet et tu peux faire

Code:

$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

Code:

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

Code:

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

 

#5 24-10-2007 19:03:36

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: Objet et BDD

ok merci je vais gratter dans cette direction

Hors ligne

 

#6 25-10-2007 09:41:14

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: Objet et BDD

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages