Enregistrer une relation ManyToMany bidirectionnelle classique

Relation ManyToMany

Relation ManyToMany – Source OpenClassroom

J’utilise essentiellement (en général) des relations ManyToMany Bidirectionnelles avec attributs contenant notamment une date de création, une date de mise à jour, un slug éventuel etc. Pour la première fois, j’avais besoin d’utiliser une relation ManyToMany bidirectionnelle sans attributs (documentation Doctrine) et cette dernière m’a posé un soucis à son enregistrement, en effet les données ne se mettaient pas à jour. Plus particulièrement, c’est la suppression d’associations qui ne fonctionnait pas, par exemple : le traitement métier qui gère le décochage d’une ou plusieurs checkbox issues de la collection.

Les méthodes addX() et removeX()

Il m’a fallut assimiler le fait que Doctrine ne persistait les données qu’à partir de  l’entité propriétaire de la relation. C’est donc de ce côté de la relation (celle qui indique le inverseBy) qu’il fallait positionner les méthodes addX() et removeX() et je les avais placées de l’autre côté hélas.

 

When a bidirectional assocation is updated, Doctrine only checks on one of both sides for these changes. This is called the owning side of the association.

 

source : Doctrine

Par ailleurs, au début je n’utilisais pas les méthodes add et remove côté entité afin de gérer proprement la collection. En fait, j’étais parti sur une mise à jour fastidieuse de la collection, objet par objet, qu’il s’agisse d’un ajout ou d’une suppression.

Et donc voici un exemple avec mise à jour du côté inverse, notez l’importance de contrôler l’existence ou non de l’objet au sein de l’ArrayCollection pour éviter les erreurs.

Je vous propose aussi de découvrir un article qui explique comment générer rapidement ces deux méthodes avec un Live Template sur PhpStorm. Sans plus attendre je vous laisse la vidéo de démonstration :

ManyToMany bidirectionnelle flush sans attributs

Partagez cet articleShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInDigg thisShare on TumblrShare on RedditEmail this to someone