IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Db PHP Discussion :

Jointure de type n à n en utilisant le mapping


Sujet :

Zend_Db PHP

  1. #1
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 36
    Par défaut Jointure de type n à n en utilisant le mapping
    Bonjour à tous !

    j'ai suivi les différents tutos proposés ici ainsi que certains ailleurs, je me suis pas mal documenté avec la doc du site officiel, mais je bute sur un point.

    Pour indication je travaille avec le Zend Framework dernière version du 0.9 (0.9.2 ou 0.9.3 je ne sais plus où on en est).

    Pour faire mon projet, une gestion d'oeuvre littéraires en ligne, j'ai pris pour base le tuto suivant :
    Débuter avec le Zend Framework (approche MVC)

    J'ai 3 tables :
    oeuvre(id, titre, description,statutmodo)
    categorise(id, id_oeuvre, id_categogie)
    categorie(id, libelle)

    J'ai poussé plus loin le tuto en intégrant les dépendances des tables dans les classes et j'arrive tres bien à faire une "jointure" en utilisant la méthode findClassViaAutreClass

    exemple de récupération de la catégorie d'une oeuvre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //récupére les catégories de l'oeuvre consultée
    $lOeuvre = $oeuvre->find($id)->current();
    $this->view->categories = $lOeuvre->findCategorieViaCategorise();
    Ca marche, quand on veut le détail d'UNE oeuvre c'est niquel ! Mais ca ne fonctionne que si j'ai UN SEUL RESULTAT, et à un moment j'affiche une liste d'oeuvre (donc un JEU DE RESULTAT) et j'aimerais indiquer le(s) genre(s) de chaque oeuvre.

    Comment faire ? Je ne vais quand meme pas boucler sur chaque oeuvre et faire à chaque fois un findCategorieViaCategorise ? Ca va multiplier de maniéres beaucoup trop importantes le nombre de requêtes à la base, si je veux afficher 20 oeuvres, ca voudrais dire que je dois faire 20 requetes à la base !
    Y a pas une maniére plus économique ? Plus propre de faire ?

    J'ai essayé pas mal de chose, mais je séche désespérement

    Pour détailler voici le reste de mon code important pour la situation :
    Le contrôleur de Oeuvre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    class OeuvreController extends Zend_Controller_Action{
     
    //methode execute a chaque construction de l'objet
    function init(){
    	$this->initView();
    	$this->view->baseUrl = $this->_request->getBaseUrl();
    	Zend_Loader::loadClass('Oeuvre');
    }
     
    //la fonction qui est censé me renvoyer une liste d'oeuvre avec le genre
    function indexAction(){
            $this->view->title = "Liste des oeuvres";
    	$oeuvre = new Oeuvre();
    	$this->view->oeuvres = $oeuvre->fetchAll("statutmodo = 1");
    	$this->render();
    }
    }
    La classe gérant le modéle Oeuvre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    class Oeuvre extends Zend_Db_Table{
    	protected  $_name = "oeuvre";
     
    	protected $_dependentTables = array('Ecrit', 'Categorise');
     
    }
    ?>
    Classe gérant le modéle categorise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    class Categorise extends Zend_Db_Table{
    	protected  $_name = "categorise";
    	protected $_dependentTables = array('Oeuvre', 'Categorie');
    	protected $_referenceMap = array (
    				'definit' => array ( 
    				        'columns' => array('id_categorie'), 
    					'refTableClass' => 'Categorie', 
    					'refColumns' => 'id'), 
    				'genre' => array ( 
    					'columns' => array('id_oeuvre'), 
    					'refTableClass' => 'Oeuvre', 
    					'refColumns' => 'id') 
    				);
    }
    ?>

  2. #2
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut
    Tu as du deja le faire mais tu as regarder la doc ?
    http://framework.zend.com/manual/en/...g.many-to-many

  3. #3
    Invité
    Invité(e)
    Par défaut
    Nop, on ne peut pas faire plus économe, sans mettre la main à la pâte
    Il faut dans ton cas écrire toi même la requête qui va réaliser la jointure, et récupérer les jeux de résultats dans les collections directement.

    Je précise que dans un developpement web, c'est très souvent le cas. Les built-in fonctionnalités de ZF sont là pour les cas tous simples, dans la grande majorité des cas, il y a necessité d'écrire soi-même sa logique

  4. #4
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 36
    Par défaut
    D'accord. Merci bien

    Je vais rajouter de ce pas une méthode à ma classe Oeuvre pour pouvoir générer une liste d'Oeuvre avec leurs genres.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VxiR2] Prompt sur auto-jointure de type MULTI
    Par bastoonet dans le forum Designer
    Réponses: 5
    Dernier message: 04/03/2010, 10h36
  2. [C#] Quel type d'objet (tableau) utiliser?
    Par cyllix dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/06/2006, 10h50
  3. Réponses: 4
    Dernier message: 23/12/2005, 19h35
  4. Réponses: 3
    Dernier message: 28/10/2005, 01h12
  5. Jointures de type OUTER JOIN
    Par Oluha dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2005, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo