Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
J'ai un objet "user" qui contient un nom et un prénom, ainsi qu'une adresse.
Cet objet est enregistré dans 2 tables différentes dans la base de données: "users" et "addresses".
"users" contient
ID FIRSTNAME LASTNAME ADDRESS_ID
"addresses" contient
ID ADDRESS CITY
Dans mon code, je définis une classe pour gérer les Users
[lang=php]class Application_Model_DbTable_Users extends Zend_Db_Table_Abstract { protected $_name = 'users'; protected $_primary = 'id'; protected $_rowClass = 'Application_Model_DbRow_User'; protected $_referenceMap = array ( 'address' => array ( 'columns' => 'address_id', 'refTableClass' => 'Application_Model_DbTable_Addresses', 'refColumns' => 'id' ) );
et une autre classe pour gérer les addresses
[lang=php]class Application_Model_DbTable_Addresses extends Zend_Db_Table_Abstract { protected $_name = 'addresses'; protected $_primary = 'id'; protected $_rowClass = 'Application_Model_DbRow_Address'; protected $_dependentTables = array('Application_Model_DbTable_Users'); }
Ensuite, je peux récupérer sans problème les données de ma table USERS principale, mais impossible de rajouter les informations de l'adresse dedans. Il doit surement falloir mapper les données d'une certaine manière ou faire quelque chose de spécifique, mais je suis un peu perdu...
Voici comment j'effectue mon appel (àl'intérieur de la classe Application_Model_DbTable_Users)
[lang=php]public function fetchCurrentUserInfo () { $id = Zend_Auth::getInstance()->getIdentity()->id; $columns = array( 'id', 'firstname', 'lastname', 'address_id' ); $select = $this->select() ->from($this, $columns) ->where ('id = ?', $id); $userInfo = $this->fetchRow($select); $userAddress = $userInfo->findParentRow('Application_Model_DbTable_Addresses'); }
J'ai bien essayé de faire $userInfo->address = $userAddress, mais cela ne fonctionne pas (et je ne compte plus le nombre d'essais que j'ai finalement tenté au petit bonheur la chance )
Si vous pouviez m'aider, ce serait vraiment appréciable!
Merci encore pour votre aide !
Hors ligne
Essai plutot
[lang=php] $userAddress = $userInfo->findDependentRowset('Application_Model_DbTable_Addresses');
à laplace de
[lang=php]$userAddress = $userInfo->findParentRow('Application_Model_DbTable_Addresses');
ps : fait gaffe car du coup tu obtiens un rowset et non seulement un row.
Hors ligne
Merci pour ta réponse shadypierre. Par contre, je ne vois pas trop ce que cela change au final. (Bon, il faut dire que j'ai toujours un peu de mal pour savoir dans quel sens il faut prendre les relations entre les tables).
Mon souci principal est que je n'arrive pas à retourner un objet métier complet "User" qui contient l'utilisateur avec son adresse.
Ai-je besoin d'une couche d'abstraction supplémentaire au niveau de mon modèle ?
Hors ligne
Ta table 'user' contient une clé étrangére vers ta table 'adresses', pour récupérer à partir d'un objet user les adresses correspondantes il faut utiliser la méthode findDependentRowset() (si tu partais d'une adresse, pour trouver l'user à qui elle appartient tu ferait un findParentRow() )
Hors ligne
oui, ça parait logique. Il me semble que c'est ce que j'avais essayé de faire dans un premier temps, mais que cela n'avait pas marché... j'avais dû faire une erreur quelque part.
Mais même en récupérant le dependentRowSet, cela ne va pas me remplir ma Row $user si je ne m'abuse.
Je commence à me demander si je ne dois pas modifier mon Application_Model_DbRow_User pour qu'il prenne en compte l'adresse (en gros inclure Application_Model_DbRow_Address dans DbRow_User). Par contre, si c'est une solution je ne vois pas trop comment faire.
Au final (mais je suis preneur de conseils sur l'approche à adopter !!), je souhaite pouvoir faire un truc du genre
[lang=php] $userInfo->address = $userInfo->findDependentRowset('Application_Model_DbTable_Addresses');
Hors ligne
Le truc c'est que tu vas obtenir un rowset car un user peut avoir plusieurs adresses. Après ce que tu as écris je ne sais pas si tu peux l'écrire directement comme ça via un objet ou si il faut passer par un tableau.
Je ne vois plus ce qui te pose probleme, tu as ton user, tu récupére les adresses de cet user, à toi de voir le traitemenr que tu veux faire avec et la façon dont tu veux le stocker.
Hors ligne
En fait, dans l'idéal je voudrais gérer un User avec toutes ses données.
Par exemple, je charge un user pour modification et je mets à jour une de ses adresses. Ensuite, je voudrais pouvoir faire un $user->save() comme je peux faire s'il s'agissait du mise à jour du nom.
Exemple
[lang=php] // Mise à jour du prénom $user->firstname = 'MonPrénom'; $user->save(); // Mise à jour avec l'adresse $user->address->street = '9 Rue de la Chance'; $user->firstname = 'MonPrénom'; $user->save();
C'est vrai que je peux toujours découper mes requetes, mais si je fais ça je considère que je gère pas des objets métiers Users à ce moment. Et donc, potentiellement, il me manquerait une couche dans mon modèle.
Hors ligne
Pour moi sit u veux faire ça il faut redéfinir dans ton model user la fonction save pour qu'elle execute les deux requetes
Hors ligne
Je suis d'accord avec toi, mais j'imagine que je dois aussi rajouter une variable de classe
$address; de type Application_Model_DbRow_Address pour que je puisse faire
[lang=php] $user->address->street = 'something';
Mais cette implémentation me semble un peu bancale en soit... Surtout que du coup je me balade avec des variables en plus dans le Row ce qui me parait un peu étrange (mais c'est peut être moi qui ait trop le nez dans le guidon...)
Comment faites vous pour gérer ce genre de cas ? (ou pouvez vous m'orienter vers un tuto qui explique comment gérer cela proprement) ?
Merci encore pour votre aide!
Hors ligne
Je t'avoue que je trouve ça bancal aussi ^^, je vois pas trop de tuto traitant ce genre de cas
Hors ligne
Utilisez Doctrine 2 les enfants.
Beaucoup plus performant, beaucoup plus propre, beaucoup plus d'actualité, beaucoup plus maintenu... et j'en passe.
Dernière modification par Ender (26-07-2011 10:59:44)
Hors ligne
Justement, je me tate pour passer à Doctrine, mais comme je n'ai absolument jamais utilisé doctrine, il faut que je me trouve un tutorial simple sur l'utilisation de Doctrine 2. Si vous avez ça sous la main (je reconnais que je n'ai pas encore cherché beaucoup, mais pour l'instant je n'ai trouvé que des tutos sur l'intégration de Doctrine).
Merci à vous !
Hors ligne
Ajoute moi sur MSN si tu veux, je répondrai à tes question dans la mesure du possible. Je commence à l'avoir en main.
dj_pierrot[@t]hotmail.fr
Hors ligne
Pages: 1