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 ?