Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Db
Zend_Db Forum d'entraide pour le composant Zend_Db du Zend Framework (création de requêtes, abstraction, ORM etc.). Avant de poster -> FAQ Zend_Db.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/09/2007, 10h53   #1
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
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 :
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 :
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 ?

Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2007, 12h01   #2
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
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
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2007, 12h12   #3
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
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.
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h47.


 
 
 
 
Partenaires

Hébergement Web