Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-07-2011 19:03:03

Schyzophrenic
Membre
Date d'inscription: 05-07-2011
Messages: 12

[1.11] Récupérer un objet définies dans 2 tables

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

Code:

ID
FIRSTNAME
LASTNAME
ADDRESS_ID

"addresses" contient

Code:

ID
ADDRESS
CITY

Dans mon code, je définis une classe pour gérer les Users

Code:

[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

Code:

[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)

Code:

[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 sad)

Si vous pouviez m'aider, ce serait vraiment appréciable!

Merci encore pour votre aide !

Hors ligne

 

#2 25-07-2011 08:36:11

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: [1.11] Récupérer un objet définies dans 2 tables

Essai plutot

Code:

[lang=php]
$userAddress = $userInfo->findDependentRowset('Application_Model_DbTable_Addresses');

à laplace de

Code:

[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

 

#3 25-07-2011 10:06:56

Schyzophrenic
Membre
Date d'inscription: 05-07-2011
Messages: 12

Re: [1.11] Récupérer un objet définies dans 2 tables

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

 

#4 25-07-2011 10:18:28

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: [1.11] Récupérer un objet définies dans 2 tables

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

 

#5 25-07-2011 10:36:52

Schyzophrenic
Membre
Date d'inscription: 05-07-2011
Messages: 12

Re: [1.11] Récupérer un objet définies dans 2 tables

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

Code:

[lang=php]
$userInfo->address = $userInfo->findDependentRowset('Application_Model_DbTable_Addresses');

Hors ligne

 

#6 25-07-2011 11:09:03

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: [1.11] Récupérer un objet définies dans 2 tables

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

 

#7 25-07-2011 11:56:49

Schyzophrenic
Membre
Date d'inscription: 05-07-2011
Messages: 12

Re: [1.11] Récupérer un objet définies dans 2 tables

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

Code:

[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

 

#8 25-07-2011 13:47:50

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: [1.11] Récupérer un objet définies dans 2 tables

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

 

#9 25-07-2011 13:52:41

Schyzophrenic
Membre
Date d'inscription: 05-07-2011
Messages: 12

Re: [1.11] Récupérer un objet définies dans 2 tables

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

Code:

[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

 

#10 25-07-2011 15:26:36

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: [1.11] Récupérer un objet définies dans 2 tables

Je t'avoue que je trouve ça bancal aussi ^^, je vois pas trop de tuto traitant ce genre de cas hmm

Hors ligne

 

#11 26-07-2011 10:59:03

Ender
Membre
Date d'inscription: 01-09-2009
Messages: 52

Re: [1.11] Récupérer un objet définies dans 2 tables

Utilisez Doctrine 2 les enfants. smile

Beaucoup plus performant, beaucoup plus propre, beaucoup plus d'actualité, beaucoup plus maintenu... et j'en passe. wink

Dernière modification par Ender (26-07-2011 10:59:44)

Hors ligne

 

#12 26-07-2011 11:06:16

Schyzophrenic
Membre
Date d'inscription: 05-07-2011
Messages: 12

Re: [1.11] Récupérer un objet définies dans 2 tables

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

 

#13 26-07-2011 14:26:08

Ender
Membre
Date d'inscription: 01-09-2009
Messages: 52

Re: [1.11] Récupérer un objet définies dans 2 tables

Ajoute moi sur MSN si tu veux, je répondrai à tes question dans la mesure du possible. Je commence à l'avoir en main. smile

dj_pierrot[@t]hotmail.fr wink

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages