methodologie de parcours d'une table

Eléphant du PHP | 288 Messages

19 avr. 2007, 07:20

Bonjour,

Je dois gérer des menus de manière dynamique. J'ai crée une table qui a pour colonne
idMenu, idParent, NomMenu

J'aimerais savoir si en une requete c'est possible de sortir un sous arbre ( menu1, menu1.1,menu1.1.1, menu2, menu2.1 etc...). Je n'arrive pas a voir comment je peux lister complètement une feuille jusqu'à son ancêtre le plus haut. Je veux pas avoir 10 milles boucles dans mon code php.

Merci de vos sugestion

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

19 avr. 2007, 10:09

Ta table contient un champ "idParent" qui sert à mettre en oeuvre un système hierachique pére/fils, n'est-ce pas? bon.

En conception celà s'appelle une relation reflexive, dont le premier parent a un "idParent" nul.

Pour lister les ascendants d'un menu X, il faut remonter l'arbre des parents par l'indicateur "idParent" jusqu'à ce que ce dernier soit nul.

Car si un "idParent" est nul, comme j'ai dis tout à l'heure, c'est qu'il s'agit du premier menu de l'arboréscence.

Une boucle le lecture des menus par la relation idMenu=idParent peut être effectuée jusqu'à ce que l'idParent lu est nul.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 288 Messages

19 avr. 2007, 19:01

merci de ta reponse

En faite, je connais cette méthode et c 'est pour ca j ai écris ici. Je voulais savoir s'il y avait une autre pour éviter de faire des boucles qui vont envoyer plusieurs requetes a ma BD. Si non, peux tu peux me faire un petit algo de la maniere dont tu vois les boucles.

merci

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

20 avr. 2007, 13:18

L'algo peut être le suivant:
menu  = getMenu("select * from menu where id = '?'"); //id d'un menu de départ
while (menu[idParent] != null){
   //recherche par parent
    menu = getMenu ("select * from menu where id = 'menu[idParent]'"); 
   //autre code de traitement
  //.....
}
la fonction getMenu($sql) est à développer : elle doit exécuter sql et retourner un tableau d'enregistrements trouvés
Modifié en dernier par sadeq le 23 avr. 2007, 09:04, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ViPHP
ViPHP | 2144 Messages

20 avr. 2007, 14:28

Tout dépend si tu as une longueur fixe pour ton menu, si oui, il est possible de le récupérer directement en une seule requette, en utilisant des alias dans la partie from de la requette.
par exemple, une profondeur de 3 :

Code : Tout sélectionner

select m1.NomMenu, m2.NomMenu, m3.NomMenu from menu m1, menu m2, menu m3 where m3.idParent = m2.id and m2.idParent = m1.id
A tester, et à adapter, mais valable que si tu connais la longeur du menu au départ.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

20 avr. 2007, 15:34

tu peux écrire le même algo en SQL en écrivant une procédure stockée ou une fonction comme tu peux remplacer la boucle While par une récursivité de fonction.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

22 avr. 2007, 08:01

merci bcp pour vos reponses. J'ai resolu mon problème. ¨ca ressemble beaucoup a ce que sadeq a expliquer.

Merci encore