Enkel categorieën zonder child elementen ophalen (logica probleem)
Categorie 1
Categorie 1 > Subcategorie 1
Categorie 1 > Subcategorie 1 > Subsubcategorie 1
Categorie 1 > Subcategorie 1 > Subsubcategorie 1 > Subsubsubcategorie 1
Categorie 1 > Subcategorie 1 > Subsubcategorie 1 > Subsubsubcategorie 2
Categorie 1 > Subcategorie 1 > Subsubcategorie 1 > Subsubsubcategorie 3
Categorie 1 > Subcategorie 1 > Subsubcategorie 1 > Subsubsubcategorie 4
Categorie 1 > Subcategorie 1 > Subsubcategorie 2
Categorie 1 > Subcategorie 1 > Subsubcategorie 2 > Subsubsubcategorie 1
Categorie 1 > Subcategorie 1 > Subsubcategorie 2 > Subsubsubcategorie 2
Categorie 1 > Subcategorie 2
Categorie 1 > Subcategorie 2 > Subsubcategorie 3
Categorie 1 > Subcategorie 2 > Subsubcategorie 3 > Subsubsubcategorie 1
Categorie 1 > Subcategorie 2 > Subsubcategorie 3 > Subsubsubcategorie 2
Categorie 1 > Subcategorie 2 > Subsubcategorie 3 > Subsubsubcategorie 3
Categorie 2
Categorie 2 > Subcategorie 3
Categorie 2 > Subcategorie 3 > Subsubcategorie 4
...enzovoort...
De bedoeling is om elke categorie ZONDER child elementen te printen, voorafgegaan door een boomstructuur van z'n parent categorieën. Als ik het toepas voor de bovenstaande structuur, dan moet ik dit bekomen:
| | Categorie 1 > Subcategorie 1 > Subsubcategorie 1 > Subsubsubcategorie 1
|V| Categorie 1 > Subcategorie 1 > Subsubcategorie 1 > Subsubsubcategorie 2
| | Categorie 1 > Subcategorie 1 > Subsubcategorie 1 > Subsubsubcategorie 3
| | Categorie 1 > Subcategorie 1 > Subsubcategorie 1 > Subsubsubcategorie 4
| | Categorie 1 > Subcategorie 1 > Subsubcategorie 2 > Subsubsubcategorie 1
| | Categorie 1 > Subcategorie 1 > Subsubcategorie 2 > Subsubsubcategorie 2
|V| Categorie 1 > Subcategorie 2 > Subsubcategorie 3 > Subsubsubcategorie 1
| | Categorie 1 > Subcategorie 2 > Subsubcategorie 3 > Subsubsubcategorie 2
| | Categorie 1 > Subcategorie 2 > Subsubcategorie 3 > Subsubsubcategorie 3
| | Categorie 2 > Subcategorie 3 > Subsubcategorie 4
De "|V|" die aan de categorieën voorafgaat zijn checkboxes, maar dat heeft uiteraard weinig met de problematiek te maken.
Kan iemand mij wat op weg helpen hoe ik deze lijst via iteraties (eventueel recursie) kan bekomen? Graag geen specifieke code, liever wat tips zodat ik m'n logisch denken wat kan opkrikken ;)
Alvast bedankt!!!
Hoe is de data opgeslagen en/of hoe krijg je het aangeleverd in de functie waar je het moet printen?
1 / Categorie1 / 0
2 / Subcategorie 1 / 1
3 / Subsubcategorie 1 / 2
4 / Subsubcategorie 2 / 2
5 ...
Via deze structuur hoor ik dus een array met de resultaten te printen.
De manier om het wel te doen is met een serie van self joins. Maar dat is weer ondoenlijk als je niet weet hoe diep de boom is. Voor elke extra laag zal je namelijk een extra join nodig hebben.
De enige manier om het met deze structuur te doen is dus om alles eruit te halen, je boom in php op te bouwen en dan uit te printen.
Als je je structuur nog kan aanpassen dan raad ik je heel erg sterk aan om eens naar de 'nested set' structuur te kijken. Conceptueel niet erg eenvoudig, maar als je het eenmaal onder de knie krijgt veel makkelijker in gebruik.
http://www.evanpetersen.com/item/nested-sets.html
http://en.wikipedia.org/wiki/Nested_set_model
http://blogs.msdn.com/b/mvpawardprogram/archive/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets.aspx
Deze structuur is een platte representatie van een boom waardoor je met zeer eenvoudige queries de gegevens op kunt halen met behoud van de boom structuur, ongeacht hoe diep de boom is. Wat wel lastiger is, is het updaten van de boom. Als je een categorie wilt toevoegen bijvoorbeeld moet je veel meer werk verzetten dan in jouw structuur. Dit kan je echter doen via een stored procedure zodat je ook dat maar eenmalig hoeft te bouwen.
Ik heb me laten wijsmaken dat die nested sets iets behoorlijk moeilijk is om mee overweg te kunnen? In ieder geval: 't doornemen eens waard. Thx ;)
Mocht je er niet helemaal uitkomen dan wil ik mijn code wel delen hier op het forum zodat ook anderen er iets aan hebben. Daar heb je echter meer aan als je in elk geval de structuur doorhebt en weet hoe het een beetje werkt. Dus neem die pagina's eens door, probeer er een begin mee te maken en lukt het niet (helemaal) dan kan ik je wel helpen (en vast anderen ook nog wel).
Ben wel benieuwd naar je sprocs, kijken of we daarin ook bijna dezelfde denkwijze hebben.