Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 18-06-2007 13:09:27

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

[MVC - Zend_Db] ORM et jointures

Bonjour à tous !

Pour ceux qui ont suivi mes anciens posts, je suis toujours sur mon appli "DocAnnonces".
Aujourd'hui, mon problème est le suivant :

Je dispose d'une table cv, et de sa classe associée Cv (dans le dossier models).
Je dispose également d'une table compétences, ainsi que d'une table reliant cv et compétences (relation n - n).

Les dépendances ont été correctement déclarées dans les 3 tables et mappées dans la table de liaison. (attention je dis table, mais bon je fais l'amalgame entre table et classe associée... comprenez bien que je parle des classes !)


Ce que je cherche à faire :
Une vue affichant une liste des CV, chacun assorti de toutes les compétences qui lui sont associées.
A mon avis, il faut faire un fetchAll() sur Cv, puis ensuite, pour chaque cv :

- afficher les infos du cv
- faire un $cv->findCompetencesViaTabledeliaison puis afficher les résultats trouvés


Jusque là, la logique y est. Sauf que le tutoriel qui m'a appris à faire ça ne gère pas l'approche MVC. Je ne sais donc pas où faire quoi.
Selon moi, les appels et les fetch...() doivent être faits par le controleur, qui passe les résultats à la vue.
Mais le problème c'est : comment passer à la vue les résultats de ce que je veux faire (cf plus haut) ? Je crée un tableau multidimentionnel ? Mais je ne sais pas trop si j'ai le droit d'ajouter à chaque row une "case" contenant la liste des compétences associées...

Existe-t-il une solution toute faite pour ce cas de figure ?

Hors ligne

 

#2 18-06-2007 16:10:55

etaque
Membre
Date d'inscription: 18-06-2007
Messages: 20

Re: [MVC - Zend_Db] ORM et jointures

Je me pose la même question, je suis également preneur d'une solution élégante smile

Hors ligne

 

#3 18-06-2007 16:29:42

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [MVC - Zend_Db] ORM et jointures

Si on réfléchit en gardant uniquement le motif MVC en tête, et en enlevant tout le code, les appels aux fetcheurs se font dans le modèle.
Le controleur tire les infos du modèle (pull), les arrange à sa sauce, pour ensuite les envoyer à la vue.
Il y a bien 3 ( minimum ) couches distinctes, qui ont chacune un rôle.
Dites vous que demain, votre vue est un fichier pdf ...., en théorie, elle est sensée traiter les mêmes données, simplement de manière différente.
Dites vous que demain, votre modèle se plug sur un système plus gros, contenant des dizaines d'autres modèles. En théorie, votre modèle ne doit absolument pas changer.

Vous pouvez aussi utiliser une approche push en autorisant la vue à accéder à certaines données du modèles, mais en lecture uniquement.

Je déconseille un fetchBiduleViaMachin() dans une boucle while => la base va tirer la langue, créez vous même vos requêtes, avec vos jointures indéxées au bon endroit et n'oubliez pas à l'occasion de cacher ces résultats.

Pour ce qui est de fecther une liste, toute simple, les viewHelpers sont là pour ca, pas besoin de controleur.

Après, c'est de la théorie MVC, c'est très permissif, on peut faire à peu prêt ce que l'on veut, mais il faut bien garder en tête ( et généralement, UML vient à la rescousse pour ca, avec ses nombreux diagrammes ) qui dépend de qui, et qui accède à qui.

Je suis en train d'écrire un tutoriel sur le modèle MVC dans ses généralités, je ferai signe dès qu'il est out ;-)

Hors ligne

 

#4 18-06-2007 16:47:25

etaque
Membre
Date d'inscription: 18-06-2007
Messages: 20

Re: [MVC - Zend_Db] ORM et jointures

Mais si on écrit une requête SQL qui fait directement les jointures, on s'interdit d'utiliser les Zend_Db_Table_Row initiaux ? Comment traiter les nouveaux champs issus de la jointure ?

Hors ligne

 

#5 18-06-2007 17:44:40

etaque
Membre
Date d'inscription: 18-06-2007
Messages: 20

Re: [MVC - Zend_Db] ORM et jointures

Julien a écrit:

Pour ce qui est de fecther une liste, toute simple, les viewHelpers sont là pour ca, pas besoin de controleur.

Pourrais-tu détailler ce point ?

Hors ligne

 

#6 18-06-2007 18:11:19

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

Re: [MVC - Zend_Db] ORM et jointures

Vivement le tutoriel sur le modele MVC, parce qu elà moi je ne comprend rien, les helpers, les models.
J'attends de voir ton tutoriel Julien
Merci


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

Hors ligne

 

#7 18-06-2007 19:24:40

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [MVC - Zend_Db] ORM et jointures

Je vois que je ne suis pas le seul à me poser la question ^^

Pour ma part, je fais mon fetchAll() sur ma table cv, puis je le transforme en array :

Code:

    function listecvAction(){
        $this->view->title = "Liste des CV actuellement en ligne";
        
        $cv = new Cv();
        $listeCv = $cv->fetchAll();
        $tabCv = $listeCv->toArray();
        
        $i=0;
        foreach($listeCv as $ceCv){
            $listeComp = $ceCv->findCompetencesViaCompcv()->toArray();
            $tabCv[$i]['competences'] = $listeComp;
            $i++;
        }
        
        $this->view->listecv = $tabCv;
        $this->render();    
    }

L'affichage du tableau mutlidimentionnel se fait dans un tableau et n'a rien de particulierement difficile smile
Ok, ca fait tirer la lanque à la base, mais j'ai pas trouvé d'autre solution...

En ce qui concerne les fetch, je les appelle avec le controleur, mais il est simple de n'appeler qu'une fonction du modele, qui lui fait les fetch. Il faut juste déplacer le code.

Dernière modification par Bast (18-06-2007 19:27:51)

Hors ligne

 

#8 19-06-2007 11:18:47

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [MVC - Zend_Db] ORM et jointures

Pour les custom helpers, la doc officielle montre un exemple ^^

Pour l'article MVC : ca vient cette semaine en théorie
Mais MVC est aussi utilisé en java (EE, Struts ... ) , et dans plein d'autres technologies ( pas forcément web, d'ailleurs ). Pour tous les gens un peu perdus, je vous conseille vivement de lire des cours de conception logicielle avant de vous attaquer à l'aveugle à du code, car là vous ne vous en sortirez pas (enfin il est toujours bon de {parfaitement} maitriser la théorie avant d'attaquer la pratique, quelque soit le domaine ).

Java regorge de très bonnes références que je conseille, orientez vous aussi vers UML => MVC et accessoirement tous les motifs qui tournent autour ( FrontController, IOC, Command, Proxy ...), ca aide réellement à la maitrise de son code et de son architecture.

Bast -> Ton code est parfaitement valable. La migration de méthode du controleur vers le modèle est une question architecturale, qui doit être débatue en théorie, avant d'écrire le code.
Quelle doit etre la réutilisabilité du modèle ?
Quel degré de factorisation doit-il atteindre ?
Quel(s) rôle(s) souhaites tu donner à ton controleur ?

plutot qu'un fetchAll() suivi d'un fetchSomethingViaAnotherThing() sur les résultats, tu peux écrire dans ton modèle directement :
public function maMethodeDeFetch(){
$select->from
$select->join
return $this->getAdapter()->fetch***($select);

Le modèle envoie directement le bon résultat au controleur, qui se chargera lui, si c'est désirable, de transformer le Rowset en Array, de transformer certaines colonnes ( inversion de date, typiquement ), etc...

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