Comment créer une relation bidirectionnel avec symfony 2 ?

Bonjour,

Aujourd’hui je vais encore faire un petit tutoriel sur Symfony 2. Je vais vous expliquer les notions de relation bidirectionnel et comment le mettre en place dans nos entité.

Pour ce tutoriel notre cas d’étude sera :

-Nos utilisateur sont inscrit dans des groupes.

-Un groupe possèdes plusieurs utilisateur.

Le sujet nous est donc posé. Pour répondre au mieux à ce problème épineux nous allons donc devoir modéliser deux classes : Utilisateur et Groupe.

Pour le moment nous ne parlons pas de la relation bidirectionnel.

Une fois que vous avez défini vos champ sur le papier je vous invite a faire un coup de commande par la console :

php app/console doctrine:generate :entity

puis laissez-vous guider. Mais attention ne rajouter pas de champ en lien avec notre lien.

On doit le rajouter a la main.

Donc passons a notre lien bidirectionnel.

Déjà qu’est-ce que c’est ?

Rien de plus qu’une propriétés de vos objet qui vous permettra par exemple de vous retourner les infos sur les groupes auxquelles un utilisateurs appartient. Ou au contraire savoir quelle utilisateurs et dans ce groupe.

Comme je vous le fait entendre je parle de propriétés et pas de champ de table, parce que une propriétés bidirectionnel ne sera pas traduit par un champ dans votre base de données. Tout cela sera traduit en une table qui sera gérer par votre ORM.

C’est cela la bidirectionnalité on peu des deux côtés récupérer les informations. Maintenant que nous avons saisi le principe, passons à la pratique.

Pour ce faire il va aussi falloir définir ce qu’on appelle l’entité propriétaire. C’est l’entité porteuse de notre lien. Cela import peut vu que c’est un lien bidirectionnel mais c’est comme ça.

Disons simplement dans notre cas que se sera Utilisateur.

Code :

// dans utilisateur

// première étape définir la propriété

/**

/* @ORM\ManyToMany(targetentity= ‘Namespace\bundle\Entity\Groupe’, inversedBy= »Utilisateurs)

**/

private $Groupes ;

// ensuite définir dans le constructeur ceci

$this->Groupes = new // array ;

// ensuite faire un getter puis le add

public function getGroupes()

{

return $this->Groupes ;

}

// le add

public function add(Namespace\bundle\Entity\Groupe $newGroupe)

{

$this->Groupe[] = $newGroupe ;

}

et voilà un côté de fait.

De l’autre côtés dans groupes.

Ajoutez y ça :

@ORM\ManyToMany(targetEntity= ‘Namespace\bundle\Entity\Utilisateur’, mappedBy=’Groupes’

private $Utilisateurs ;

même chose de l’autre côté

par la suite a chaque fois que vous rajouter l’utilisateur dans un groupe, ajoutez le aussi dans Groupes->addUtilisateur($mycurrentUser) ;

NB : pour savoir exactement marche bidirectionnalité c’est simplissime côté propriétaire utiliser inversedBy et il suffit d’inverser par la propriété de la targetentity correspondante. Et vice versa.

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s