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 :

Liaison entre tables avec jointure [Fait]


Sujet :

Zend_Db PHP

  1. #1
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut Liaison entre tables avec jointure
    Bonjour,

    Je me suis mis à utiliser le Zend Framework dans mes applications PHP afin d'avoir un code plus propre, plus efficace.

    J'aimerai faire lier des tables entre-elles. Cette question revient assez souvent sur le forum, et la question est souvent la même : voir le tutoriel de Julien Pauli à ce sujet. Ce que j'ai fait. Cependant, il propose une solution qu'il juge lui même peu efficace au niveau des performances, puisqu'il n'y a pas de jointure au niveau des requêtes SQL, par conséquent, il faut plusieurs requêtes avant d'obtenir le résultat voulu.

    Voici comment je faisais un chemin de fer avec Doctrine :

    La classe Page, qui représente une page de mon site :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
    /**
     * This class has been auto-generated by the Doctrine ORM Framework
     */
    class Page extends Doctrine_Record
    {
        public function setTableDefinition()
        {
            $this->hasColumn('id', 'integer', 2, array('notnull' => true,
                                                       'primary' => true,
                                                       'autoincrement' => true,
                                                       'unsigned' => true));
     
            $this->hasColumn('id_parent', 'integer', 2, array('notnull' => true,
                                                              'unsigned' => true));
     
            $this->hasColumn('titre', 'string', 20, array('notnull' => true));
            $this->hasColumn('lien', 'string', 50, array('notnull' => true));
        }
        public function setUp()
        {
    		$this->hasOne('Page as Parent', array('local' => 'id_parent', 'foreign' => 'id'));
    		$this->hasMany('Page as Enfants', array('local' => 'id', 'foreign' => 'id_parent'));
        	$this->index('id_parent', array('fields' => 'id_parent'));
    	}
    }
    La classe qui construit le chemin de fer :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?php
     
    	/**
    	 *
    	 *
    	 */
    	class Railroad {
     
    		public static function getRailroad($db, $id)
    		{
    			$road = $db->getTable('Page')->find($id);
     
    			if($road->exists()) {
    				$railroad = "Vous êtes ici ";
     
    				if(Railroad::hasParent($road)) {
    					$railroad .= Railroad::makeParentRoad($road->Parent);
    				}
     
    				$railroad .= " => ". '<a href="'. $road->lien .'" title="'. $road->titre .'">'. $road->titre ."</a>";
     
    				return $railroad;
    			}
     
    			return "Erreur lors de la formation du 'chemin de fer' !";
    		}
     
    		public static function makeParentRoad($parentroad) {
     
    			if(Railroad::hasParent($parentroad)) {
    				return Railroad::makeParentRoad($parentroad->Parent). ' => <a href="'. $parentroad->lien .'" title="'. $parentroad->titre .'">'. $parentroad->titre ."</a>";
    			}else {
    				return ' => <a href="'. $parentroad->lien .'" title="'. $parentroad->titre .'">'. $parentroad->titre ."</a>";
    			}
     
    			return "";
    		}
     
    		public static function hasParent($road) {
    			return $road->Parent->id != 0;
    		}
     
    	}
    ?>
    Ma question est la suivante : est-il possible de faire quelque chose de semblable avec le ZF, sans faire une requête à chaque fois pour obtenir l'objet parent ?


  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 424
    Points : 15 796
    Points
    15 796
    Par défaut
    je n'ai jamais utilisé Doctrine donc je suppose qu'il y a une requête d'exécutée à chaque appel de $parentroad->Parent c'est ça ?

    ce que tu cherches à faire c'est de l'optimisation des ressources et donc ça n'a "rien à voir" à avec la POO puisque en théorie l'optimisation de ton code doit se faire à la fin du développement quand tout est en place et que ça fonctionne
    une solution pour réduire le nombre de requête serait d'avoir un structure de ce genre pour la table Page :
    http://sqlpro.developpez.com/cours/arborescence/

    mais encore une fois je te propose une solution où tu dois revoir une grande partie de ton code, j'en suis conscient

  3. #3
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Effectivement, j'avais lu ce tutoriel pour tout autre chose, mais comme je n'ai pas encore écrit beaucoup de code afin de partir sur de bonne base, implémenter ce système n'est pas très long.

    En fait, je ne suis pas sûr que Doctrine fasse une requête à chaque appel $page->Parent, peut être qu'il charge tous les parents dès la première requête, mais je n'ai pas vérifié.

    En attendant je vais faire la méthode de Julien, mais cela est frustrant, car j'ai justement essayé ZF pour éviter ce genre de situation

    Merci.

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

Discussions similaires

  1. [AC-2010] Requete avec liaison entre tables
    Par junty dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 19/06/2012, 17h17
  2. Editer liaison entre table avec Formulaire
    Par Thaumas dans le forum Access
    Réponses: 1
    Dernier message: 24/03/2009, 23h27
  3. Problème avec une liaison entre table
    Par dominou73 dans le forum Hibernate
    Réponses: 7
    Dernier message: 29/10/2007, 15h29
  4. Liaison entre tables
    Par Thierry69800 dans le forum Access
    Réponses: 1
    Dernier message: 20/11/2005, 23h19
  5. Problèmes de liaisons entre tables ...
    Par Mangun dans le forum Access
    Réponses: 2
    Dernier message: 28/09/2005, 11h35

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