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é :
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 :
1 2
| Table group_group
ancestor_id | descendant_id | depth |
Ainsi, si j'ai par exemple cet ensemble de données :
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 :
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é :
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.
Partager