Bonjour,

J'ai un objet Group faisant référence à lui-même dans le cadre d'une relation parent-enfant, donc voici le schéma simplifié :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Table group
id | parent_id | name
Étant donné que l'arbre d'héritage peut être assez important, j'utilise une autre table pour y enregistrer toutes les relations de hiérarchie entre les groupes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Table group_group
ancestor_id | descendant_id | depth
Ainsi, si j'ai par exemple cet ensemble de données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Table group
id | parent_id | name
1  | null      | Europe
2  | 1         | France
3  | 2         | Paris
 
Table group_group
ancestor_id | descendant_id | depth
1           | 2             | 1
2           | 3             | 1
1           | 3             | 2
Je peux récupérer directement tous les ancêtres ou les descendants d'un groupe particulier.

Actuellement, ma classe Group contient le code de mapping suivant :
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
/**
     * @ManyToMany(targetEntity="Group", mappedBy="descendants")
     *
     * @var ArrayCollection Group[]
     */
    private $ancestors;
 
    /**
     * @ManyToMany(targetEntity="Group", inversedBy="ancestors")
     * @JoinTable(name="group_group",
     *      joinColumns={@JoinColumn(name="ancestor_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="descendant_id", referencedColumnName="id")}
     * )
     *
     * @var ArrayCollection Group[]
     */
    private $descendants;
J'aimerais savoir s'il est possible d'ajouter des paramètres à ces relations, ou encore mieux d'écrire soi-même le DQL de la relation à effectuer, comme ceci par exemple pour retourner les ancêtres sur 3 niveaux d'un groupe spécifié :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT g.* FROM `group` g JOIN group_group gg ON g.id = gg.ancestor_id  WHERE gg.descendant_id = $groupId AND gg.depth BETWEEN 1 AND 3 ORDER BY gg.depth
Merci de votre aide.