Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 01-09-2008 16:57:49

keops
Nouveau membre
Date d'inscription: 01-09-2008
Messages: 1

[Zend_Db][1.5.3]Relations N-N Zend_Db_Table_Abstr et Zend_Db_Table_Row

Bonjour à tous,

Je débute avec le Zend Framework. Je suis à la base un développeur .NET et je m'initie à l'open source.
J'ai commencé un nouveau projet et je rencontre mon premier soucis avec les bases de données.

J'ai pas mal lu et relus la documentation du Framework. J'ai bien compris la notion de Zend_Db_Table_Abstract et Zend_Db_Table_Row. L'un retournant une collection d'enregistrement, l'autre un enregistrement de cette collection.

Mon soucis est dans la gestion des relations N-N. Pour faire simple je vais prendre un exemple. J'ai dans ma base de données 3 tables :

- Une table utilisateur

Code:

class User extends Zend_Db_Table_Abstract {
      /**
       * The default table name 
       */
       protected $_name = 'user';
}

- Une table groupe

Code:

class Group extends Zend_Db_Table_Abstract {
      /**
        * The default table name 
        */
        protected $_name = 'group';
}

- Une table usergroup
Cette table fait le lien selon la règle "un utilisateur appartient à 1 ou N groupes et un groupe contient 1 ou N utilisateurs"

Code:

class UserGroup extends Zend_Db_Table_Abstract {
     protected $_name = 'usergroup';

     protected $_dependentTables = array('Group','User');
     
    protected $_referenceMap    = array(
     'groupes' => array( 
            'columns'           => array('pro_id'),// la colonne de UserGroup est grp_id
            'refTableClass'     => 'Group', // la classe des Groupes est 'Group'
            'refColumns'        => 'pro_id' // la clé primaire de Groupes est grp_id
        ),   
     'users' => array( 
            'columns'           => array('usr_id'), 
            'refTableClass'     => 'User', 
            'refColumns'        => 'usr_id'
        ));
}

Voici un petit schéma de la structure de ces tables
http://jayceleconquerant.free.fr/divers/zend_db.gif

En fait j'ai l'habitude en .NET que lorsque je récupére un objet Utilisateur, j'ai dans ses membres une propriété groups qui est une collection de groupes dont l'utilisateur fait partie.

J'aimerai reproduire ce même comportement avec Zend mais je n'y arrive pas.

Par exemple pour les utilisateurs j'ai créer une classe qui hérite de Zend_Db_Table_Row

Code:

class UserRow extends Zend_Db_Table_Row_Abstract{   
 // ...personnalisations
}

et j'ai ajouter dans ma classe User

Code:

protected $_rowClass = 'UserRow';

Tout marche impécable tant que je ne sors pas des traditionnel méthode CRUD de SQL sur une table, j'arrive aussi à récupérer les enregistrements associer avec les méthodes findManyToManyRowset et autres. Mais ce que j'aimerai c'est avoir quelque chose du style :

Code:

$monUser = new User();
$monUser = fetchRow('usr_id=1');
$sesGroupes = $monUser->groups; //ICI ca me retournerai ses groupes

Vous allez dire OK je peux récupérer ses groupes avec findManyToManyRowset mais je veux aussi que lorsque je fait un $monUser->save(); Ca m'enregistre aussi les groupes que j'aurai ajouter ou mis à jour dans la propriété groupes.

J'ai une interface qui permet de créer un utilisateur dans un BO et de lui associer des groupes, mais tant que je n'ai pas valider, mon objet est uniquement construit en mémoire.

C'est à ce niveau que je bloque en fait, pour étendre la classe ROW. Pour le moment j'ai créer une classe User sans hériter de ROW que je gére indépendamment.

Voilà j'espère m'être fait comprendre par ces longues explications. Bref j'ai l'impression que je m'embrouille plus qu'autre chose. Je suis sur c'est un truc très simple ou alors peut-être n'est ce pas prévu ?

Si quelqu'un pouvait m'éclairer sur la gestion des relations N-N.

Cordialement,

Hors ligne

 

#2 03-09-2008 15:30:02

fte
Membre
Lieu: 06 13 83
Date d'inscription: 16-05-2008
Messages: 112
Site web

Re: [Zend_Db][1.5.3]Relations N-N Zend_Db_Table_Abstr et Zend_Db_Table_Row

On peut pas faire quelque chose en étendant Zend_Db_Table_Row car il y a la méthode magique __call() dedans ?

Hors ligne

 

#3 03-10-2008 23:31:23

hicham
Nouveau membre
Date d'inscription: 03-10-2008
Messages: 7

Re: [Zend_Db][1.5.3]Relations N-N Zend_Db_Table_Abstr et Zend_Db_Table_Row

///////////////// struct db /////////////////

membre (id_membre, nom )

content  (id_content, id_membre)


/////////////////models ////////////////////

class content extends Zend_Db_Table
{
    protected $_name = 'content';
    protected $_primary = 'id_content';
    protected $_dependentTables = array('categorie', 'membre');

    protected $_referenceMap    = array(
   
         'categorie' => array(
                'columns'           => array('id_categorie'),// la colonne de UserGroup est grp_id
                'refTableClass'     => 'categorie', // la classe des Groupes est 'Group'
                'refColumns'        => 'id_categorie' // la clé primaire de Groupes est grp_id
            ),   
         'membre'    => array(
                'columns'           => array('id_membre'),
                'refTableClass'     => 'membre',
                'refColumns'        => 'id_membre'
            ));

    public function getContentIntro()
    {

        $db = $this->getAdapter();
        $where = $db->quoteInto("front = ?", "O");
        /* ->join('membre', 'membre.id_membre=contenu.id_membre');*/
        $order = "id_content";
        return $this->fetchAll($where, $order);

    }


}

class membre extends Zend_Db_Table
{
    protected $_name    = 'membre';
    protected $_primary = 'id_membre';
   
   
    public function getMembreById($id_membre)
    {
       
        return $this->fetchAll('id_membre='.$id_membre);
       
    }

    public function getAllMembre()
    {
        return $this->fetchAll();
    }

}


//////////////////////  controllers /////////
    function indexAction()
    {


        $contenus = new contenu();
        $this->view->contenu = $contenus->getContentIntro();       


    }

//////////////////////  views /////////

<?php foreach ($this->contenu as $contenus): ?>
         
         <?php echo  $contenus->id_membre; ?>
         <?php echo $contenus->nom; ?>

<?PHP endforeach; ?>

////////////////// ERROR /////////////////:

il me donne cette error ???????????????!!!

Fatal error: Uncaught exception 'Zend_Db_Table_Row_Exception' with message 'Specified column "nom" is not in the row' in C:\wamp\www\ZendBlog\library\Zend\Db\Table\Row\Abstract.php:182 Stack trace: #0 C:\wamp\www\ZendBlog\application\views\scripts\index\index.phtml(17): Zend_Db_Table_Row_Abstract->__get('nom') #1 C:\wamp\www\ZendBlog\library\Zend\View.php(107): include('C:\wamp\www\Zen...') #2 C:\wamp\www\ZendBlog\library\Zend\View\Abstract.php(787): Zend_View->_run('.\application\v...') #3 C:\wamp\www\ZendBlog\library\Zend\Controller\Action\Helper\ViewRenderer.php(921): Zend_View_Abstract->render('index/index.pht...') #4 C:\wamp\www\ZendBlog\library\Zend\Controller\Action\Helper\ViewRenderer.php(942): Zend_Controller_Action_Helper_ViewRenderer->renderScript('index/index.pht...', NULL) #5 C:\wamp\www\ZendBlog\library\Zend\Controller\Action\Helper\ViewRenderer.php(981): Zend_Controller_Action_Helper_ViewRenderer->render() #6 C:\wamp\www\ZendBlog\library\Zend\Controller\Action\HelperBroker.php(171): Zend_Controller_Action_H in C:\wamp\www\ZendBlog\library\Zend\Db\Table\Row\Abstract.php on line 182

Hors ligne

 

#4 04-10-2008 11:55:28

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Zend_Db][1.5.3]Relations N-N Zend_Db_Table_Abstr et Zend_Db_Table_Row

Hello,

Code:

    public function getContentIntro()
    {

        $db = $this->getAdapter();
        $where = $db->quoteInto("front = ?", "O");
        /* ->join('membre', 'membre.id_membre=contenu.id_membre');*/
        $order = "id_content";
        return $this->fetchAll($where, $order);

    }

$this->fetchAll implique que tu requêtes sur la table dans laquelle tu es, que si c'est la seule table, dès ton join elle n'est plus prise en compte.

A l'arrache, je dirais :

Code:

    public function getContentIntro()
    {

        $select =  $this->select()
                        ->from($this) // <- pour prendre la table content
                        ->join('membre', 'membre.id_membre=contenu.id_membre')
                        ->where('"front = ?", "O")
                        ->order('id_content');
        return $this->getAdapter()->fetchAll($select);
    }

A+

Dernière modification par mikaelkael (04-10-2008 13:12:30)


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#5 04-10-2008 14:44:29

hicham
Nouveau membre
Date d'inscription: 03-10-2008
Messages: 7

Re: [Zend_Db][1.5.3]Relations N-N Zend_Db_Table_Abstr et Zend_Db_Table_Row

en peut utiliser  ->join('membre', 'membre.id_membre=contenu.id_membre'); sans déclarer les referenceMap    et les depandaces ,

Hors ligne

 

#6 04-10-2008 15:19:36

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Zend_Db][1.5.3]Relations N-N Zend_Db_Table_Abstr et Zend_Db_Table_Row

Hello,

Si c'est bien une question, la réponse est oui smile

Les $_dependentTables ET $_referenceMap sont utilisées seulement si ton SGDB ne te permet pas de faire l'intégrité référentielle (pour faire les opérations en cascade).

La $_referenceMap peut être utilisée seule pour faire des requêtes de mise en relation automatique (voir la doc).

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#7 30-10-2008 17:44:14

hicham
Nouveau membre
Date d'inscription: 03-10-2008
Messages: 7

Re: [Zend_Db][1.5.3]Relations N-N Zend_Db_Table_Abstr et Zend_Db_Table_Row

j aimrai avoir vos remarques sur la structure et le code de ce petit blog que j réalisé avec zend
voici le lien de téléchargement http://www.portail-rabat.com/ZendBlog.rar
voici un demo http://www.hichamsassa.c.la/
Merci

Dernière modification par hicham (19-11-2008 01:51:25)

Hors ligne

 

#8 08-11-2008 12:50:15

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: [Zend_Db][1.5.3]Relations N-N Zend_Db_Table_Abstr et Zend_Db_Table_Row

hicham a écrit:

j aimrai avoir vos remarques sur ce petit blog que j réalisé avec zend
voici le lien de téléchargement http://www.portail-rabat.com/ZendBlog.rar
voici un demo http://www.hichamsassa.c.la/
Merci

Le look est classique mais sympa.
En revanche, les liens ne fonctionnent pas...

Hors ligne

 

#9 19-11-2008 01:48:51

hicham
Nouveau membre
Date d'inscription: 03-10-2008
Messages: 7

Re: [Zend_Db][1.5.3]Relations N-N Zend_Db_Table_Abstr et Zend_Db_Table_Row

en local les ça marche bien, mais quand j l remonté au serveur il ma donné ce probléme

Hors ligne

 

#10 19-11-2008 11:33:14

gchau
Membre
Date d'inscription: 15-05-2008
Messages: 17

Re: [Zend_Db][1.5.3]Relations N-N Zend_Db_Table_Abstr et Zend_Db_Table_Row

Bravo pour ton blog hicham . Il est très classique et donc simple à consulter.

Merci aussi de nous en faire partager les sources que j’ai parcourus rapidement (pardon d’avance donc pour les erreurs probables qui vont suivre dans les commentaires) qui sont riches d’enseignement car ils sont d’une grande simplicité et lisibilité d’écriture que ce soient le controleur, les modeles, les formulaires et les vues.

Qqs petites remarques un peu puristes peut-être :
-pourquoi ne pas utiliser les view helper partial et partialloop plutôt que render et foreach , 
-à mon avis ce serait mieux aussi que les formulaires soient regroupés sous un répertoire « forms » sous le répertoire models.

Concernant les liens qui ne marchent pas je me demande si la partie url relative qui provient (si j'ai bien compris) de colonnes de tables est bien alimentée et si tu utilises bien, dans ce cas précis des liens, le helper baseurl. 
A+

Hors ligne

 

#11 19-11-2008 18:06:31

gchau
Membre
Date d'inscription: 15-05-2008
Messages: 17

Re: [Zend_Db][1.5.3]Relations N-N Zend_Db_Table_Abstr et Zend_Db_Table_Row

Excuse moi hicham mais faute de temps j’ai été beaucoup trop vite ce matin dans mon appréciation  de ton Appli  et je m’aperçois en y revenant à nouveau depuis qqs minutes qu’en fait de lien perdu il y a me semble-t-il un problème assez sérieux au niveau de la conception « vue contrôleur » qui ne prend pas bien en compte  les spécificités de zf  à cet égard.

A tous tes liens relatifs  à des contenus variables devraient correspondre une action d’un contrôleur cad au final à un script  associé à ce couple vue contrôleur. Ce n’est pas du tout le cas si on regarde par exemple les liens que tu construit dans « application\views\scripts\index\categories.phtml » .
Il y a peut-être des connaissances à revoir concernant le ViewRenderer.

D’autre part en supposant que ces liens déclenchent  effectivement une action il serait naturel d’afficher le contenu spécifique à cette action en l'insérant dans un layout fixe via le mécanisme du Zend_Layout .

Encore une chose l’usage veut qu’à  chaque table corresponde un contrôleur.

Voilà j’aurais du regarder un peu mieux ce matin et ne pas trop me laisser enthousiasmer par la présentation qui est bonne.
Bon courage et A+ .

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