[Doctrine] Organiser les résultats : 3 tables en relation OneToMany et ManyToMany
Bonjour, Bonsoir, j'aurais besoin d'aide pour un problème d'utilisation de Doctrine.
Si je prends par exemple 3 tables :
Citation:
Case 1-n _ 1-1 Personne 1-n _ n-1 Mission
1 case peut contenir plusieurs personnes
1 personne ne peut être que sur une case
et une relation bi-directionnelle entre Personne et Mission avec plusieurs personnes concernées par une même mission et plusieurs missions pour une même personne.
Si je veux afficher pour une case donnée, toutes les personnes présentes et à côté de chaque personne les missions qui la concerne c'est facile je fais :
Code:
1 2 3 4 5 6 7
| $q = Doctrine_Query::create()
->select('c.*, p.*, m.*')
->from('Case c')
->leftJoin('c.Personnes p')
->leftJoin('p.Missions m')
->where('c.id = 1');
$results = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY); |
et j'obtiens quelque chose comme ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| Case
Personnes => array(
0 => Personne
nom
Missions => array(
0 => Mission
nom
objectif
1 => ...
)
1 => ...
) |
Et l'affichage se fait sans problème.
Mais si je veux afficher pour une case donnée, toutes les missions et à côté de chaque mission les personnes qui sont concernées par la mission je n'ai pas trouvé de moyen simple pour obtenir un tableau de résultat qui ressemblerait à ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| Case
Missions => array(
0 => Mission
nom
objectif
Personnes => array(
0 => Personne
nom
1 => ...
)
1 => ...
) |
- dois-je créer une relation directe entre Case et Mission avec une nouvelle table de relation, ce qui serait un peu redondant au niveau des données ?
- dois-je faire une autre requête du genre
Code:
1 2 3 4 5 6 7 8
| $q = Doctrine_Query::create()
->select('c.*, p.*, m.*, pp.*')
->from('Case c')
->leftJoin('c.Personnes p')
->leftJoin('p.Missions m')
->leftJoin('m.Personnes pp')
->where('c.id = 1');
$results = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY); |
afin d'obtenir quelque comme ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Case
Personnes => array(
0 => Personne
nom
Missions => array(
0 => Mission
nom
objectif
Personnes => array(
0 => Personne
nom
1 => ...
)
1 => ...
)
1 => ...
) |
et ensuite parcourir toutes les Missions pour créer moi-même Case["Missions"] dans le tableau de résultat ?
Est-ce que Doctrine est fait pour ça ?
En gros, quel est le moyen le plus simple ? :D
Merci.