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 ?
:merci: