2010-07-02 9 views
0

Dans ma base de données, la gestion des utilisateurs est divisée en deux tables: - Une créée par le plugin symfony sfDoctrineGuard (sfGuardUser), avec le nom d'utilisateur, le mot de passe et autres informations utilisées par le plugin - un autre que j'ai créé pour étendre cette table avec plus de propriétés telles que le prénom, le nom de famille etc ...Comment fusionner deux entités de doctrine dans le même objet

Ce que je veux faire est de rassembler toutes les propriétés des deux tables dans un même objet pour afficher toutes les informations relatives à un membre sur une page spécifique.

Dans ce but, je ne Jointure des deux tables comme ceci:

$q = $this->createQuery() 
->from('sfGuardUser u') 
->leftJoin('u.Mishmember m WITH u.id = ?', $rel['member_id']); 

$member = $q->fetchOne(); 

Mon problème est que la requête générée semble correcte car il sélectionne tous les attributs des deux tables, mais dans la variable $ membre , Je peux seulement accéder aux propriétés de l'objet sfGuardUser.

Je souhaite que l'objet $ member encapsule toutes les propriétés des objets tables/doctrine.

Comment le feriez-vous?


EDIT1: si je fais un

print_r($member->toArray()) 

après le code précédent je reçois un tableau à 2 dimensions contenant toutes les propriétés de sfGuardUser dans une première dimension et les propriétés de ma deuxième table dans une seconde dimension. Pour être clair le résultat de print_r est comme:

Array (
    [table1-prop1] => value 
    [table1-prop2] => value 
    [table1-prop3] => value 
    [Table2] => Array (
        [table2-prop1] => value 
        [table2-prop2] => value 
        [table2-prop3] => value 
        [table2-prop4] => value 
    ) 
) 

donc d'accéder par exemple la propriété table2-prop3 que je dois faire: $ var [Tableau 2] [table2-prop3];

Ce qui est pas ce que je veux parce que je veux considérer toutes les propriétés dans le cadre de la sameobjet ou un tableau Si vous êtes toujours avec moi (comme s'il n'y avait qu'une seule table.)

le tableau ci-dessus devrait ressembler à:

Array (
    [table1-prop1] => value 
    [table1-prop2] => value 
    [table1-prop3] => value 
    [table2-prop1] => value 
    [table2-prop2] => value 
    [table2-prop3] => value 
    [table2-prop4] => value 
    ) 
) 

Espérons que cela aide à comprendre mon problème.


EDIT2 (réponse à DuoSRX et DrColossos)

Merci aussi pour vos réponses intéressantes.

Eh bien, la raison pour laquelle je préfère ne pas avoir une propriété Mishmember dans mon sfGuardUser est que les deux tables/classes représentent la même entité (l'utilisateur). Bien que cette fragmentation soit inévitable dans ma base de données (il ne serait pas judicieux d'éditer directement le sfGuardPlugin pour ajouter mes propriétés), j'aimerais que le code de l'application soit comme si j'avais une table, parce que ce serait beaucoup plus sensé et logique à utiliser (imaginez qu'un autre développeur ne connaissant pas le modèle devra travailler sur le contrôleur ou les modèles ...)

Que penseriez-vous de l'ajout d'un utilisateur de classe Doctrine héritant de sfGuardUser? et Mishmember (y a-t-il plusieurs héritage dans PHP5?) de sorte que mon contrôleur n'aurait qu'une seule classe d'utilisateurs à gérer?

Il me semblerait beaucoup plus logique de demander à tous les attributs de n'importe quel utilisateur sans prendre la peine de savoir dans quelle table ils sont stockés.

Je ne suis pas sûr de la façon dont fonctionne l'héritage de la doctrine, mais il semble la solution la plus élégante me (s'il vous plaît me dire si je me trompe!)

Je ne suis pas sûr que je suis assez pour s'il vous plaît clair N'hésitez pas à demander quoi que ce soit.

Répondre

1

Si vous n'avez pas besoin d'objets, mais simplement des tableaux que vous pouvez faire:

$result = $query->fetchArray(); 
$mishmember = $result['Mishmember']; 
unset($result['Mishmember']); 
$user = array_merge($result, $mishmember); 

Cela devrait faire l'affaire, mais je pense que cela est trop complexe. Quel est le problème avec un tableau multidimensionnel?

Edit:

Eh bien vous pouvez alors utiliser héritage simple ou column_aggregation:

Mishmember: 
    inheritance: 
    type: simple (or column_aggregation) 
    extends: sfGuardUser 
    columns: 
    myfield: 
     type:integer 

Et puis:

$mishmember = Doctrine::getTable('Mishmember')->find(1); 
echo $mishmember->myfield; 

Voir la doctrine documentation pour plus sur l'héritage.

+0

Merci, je viens de répondre en éditant mon poste (EDIT2) –

+0

J'ai également édité ma réponse :) – DuoSRX

+0

Il semble être exactement ce que je cherchais et je m'attendais à ce que ce soit beaucoup plus compliqué. Merci beaucoup! –

0

Ce n'est pas vraiment le fonctionnement des ORM: Comme vous l'avez noté, vous obtenez un sfGuardUser Object/Array. Maintenant, le Mishmember n'est rien de plus qu'une propriété à sfGuardUser (c'est un coïncident, c'est-à-dire un objet lui-même). Donc, au lieu d'avoir juste un e.g. propriété de chaîne, vous avez une propriété objet/tableau.

éditer: De yourse vous pouvez fusionner/combiner/recréer le tableau/objet (comme l'indique l'autre réponse), si vous n'aimez pas l'aspect multidimensionnel. Mais gardez à l'esprit que ces opérations peuvent devenir très complexes lorsque vous avez des quantités plus importantes de données renvoyées.

+0

Merci, je viens de répondre en éditant mon post (EDIT2) –

Questions connexes