Bonjour à tous,

je rencontre un petit souci. J'ai deux entités, Sandwich et Ingrédient, qui sont associés dans deux relations ManyToMany :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * @Entity @Table(name="sandwichs")
 */
class Sandwich
{
/**
	 * @ManyToMany(targetEntity="Ingredient")
	 * @JoinTable(name="ingredients_principaux_sandwichs",
	 * 		joinColumns={@JoinColumn(name="sandwich_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="ingredient_id", referencedColumnName="id")})
     * @var Ingredient[]
	 **/
	protected $ingredientsRecurrents = null;
 
 
	/**
	 * @ManyToMany(targetEntity="Ingredient")
	 * @JoinTable(name="ingredients_facultatifs_sandwichs",
	 * 		joinColumns={@JoinColumn(name="sandwich_id", referencedColumnName="id")},
	 *      inverseJoinColumns={@JoinColumn(name="ingredient_id", referencedColumnName="id")})
	 * @var Ingredient[]
	 **/
	protected $ingredientsFacultatifs = null;
 
...}
Un Sandwich a plusieurs Ingrédients. La relation est uni-directionnelle, elle n'est donc pas définie au niveau de l'entité Ingrédient. Cependant un même Ingrédient peut appartenir à plusieurs Sandwichs, en étant soi récurrent ou facultatif.

Mon souci est lors de l'association d'un Ingrédient à un Sandwich, récurrent ou facultatif peu importe. Si l'association existe déjà entre les deux instances, je rencontre une exception de contrainte d"intégrité de duplication. Je peux certes parser le message de l'exception et en déduire le problème rencontré mais je n'aime pas trop cette solution et souhaiterait effectuer la vérification de non-duplication en amont.

Or je ne vois pas trop comment faire avec les outils de Doctrine. Les relations ingredients_principaux_sandwichs et ingredients_facultatifs_sandwichs n'étant pas définis comme des entités, je ne vois pas trop comment les requêter directement avec le QueryBuilder, en DQL ou autres. Je pourrais certes récupérer tous les ingrédients d'un sandwich et boucler dessus pour déterminer si le nouvel ingrédient à associer ne l'est pas déjà mais c'est quand même pas terrible et il doit bien y avoir moyen de requêter l'information directement.

Avez-vous une idée sur la marche à suivre ?