Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
bonjour à vous
Je test la jointure de table sous ZEND_DB
j'ai ma classe enfant :
class Application_Model_DbTable_Albums extends Zend_Db_Table_Abstract
{
protected $_name = 'albums';
// jointure avec région
protected $_referenceMap = array(
'Noms' => array(
'columns' => 'id_reg',
'refTableClass' => 'Application_Model_DbTable_Regions',
'refColumns' => 'id_reg'
),
);
}
qui est jointe à ma classe Parent : région
class Application_Model_DbTable_Regions extends Zend_Db_Table_Abstract
{
protected $_name = 'regions';
protected $_dependentTables = array('Application_Model_DbTable_Albums');
}
Relation N --> 1
.... Je me demande comment obtenir dans mon controleur
un tableau avec le resultat de la jointure ?
A' savoir toutes les colonnes de la table parent associées à celles de la table enfant
.... une sorte de vue
J'ai demarré quelque chose comme cela mais je ne sais pas ou aller ?
function indexAction()
{
$albums = new Application_Model_DbTable_Albums();
$this->view->albums = $albums->fetchAll();
$ligne = $albums->fetchAll()->current();
$nomRegion = $ligne->findParentRow('Application_Model_DbTable_Regions', 'Noms');
$this->view->nomRegion = $nomRegion;
}
Là j'ai deux tableaux pour ma vue au lieu d'un seul dénormalisé
Merci pour votre aide
Hors ligne
Zend_Db_Select
Hors ligne
Bonjour, je me pose la même question que bamak. Comme la réponse de sekajin n'est pas vraiment un réponse claire, je me demandais si celle-ci pourrait être un peu plus élaboré. Quand tu parle d'utiliser Zend_Db_Select, tu parle de l'utiliser de quelle façon ?
J'ai regardé en détails la documentation ici. http://framework.zend.com/manual/fr/zen … ships.html La seul référence au "Select" semble être dans l'exemple #3, mais celle-ci contient probablement des erreurs car, premièrement en utilisant les BDD d'exemple, le champ "name" n'existe pas.
Merci d'avance
Hors ligne
Salut,
Effectivement il faut passer par Zend_Db_Select pour effecter des jointures. C'est possible avec Zend_Db_Table mais il faut passer par des solutions pas très élégantes à base de setIntegrityCheck(false)...
Ce que je fais personnellement, c'est que dans mon mapper je définis les relations, par exemple :
$relations = array('profile' => array('mapper' => 'Application_Mapper_Profile'));
Je définis dans chaque mapper une fonction with prenant le nom d'une relation. Ainsi, si je veux charger un utilisateur avec son profil, j'aurais quelque chose du genre :
$user = $userMapper->newQuery()->where("username = toto")->with('profile')->fetch();
La fonction with va juste créer la jointure sur le select.
La question qu'il reste c'est : comment créer deux objets de type différents ? La seule solution que j'ai trouvé est de préfixé chaque élément par le nom de la table. Ainsi, les noms de colonnes pour l'utilisateur seront par exemple user.id, user.username, user.password... Ce qui implique qu'il faut que ton mapper définisse le nom de tous tes éléments. A contrario, quand tu appelles la fonction with, tu vas récupérer toutes les colonnes et les préfixées par le nom de la classe jointe ("profile").
Ensuite, une fois que tu as récupéré les valeurs, tu peux facilement récupérer les bonnes colonnes et créer les objets correspondants.
Je ferai sûrement un p'tit message la dessus. On peut facilement avoir des jointures, du lazy-loading... sans passer par des solutions trop complexes à la Doctrine, et qui suffisent pour la majorité des usages. D'ailleurs c'était ce que proposais Zend_Entity avant d'être abandonné, mais on peut facilement réécrire une petite partie utile.
Hors ligne