Szevasztok, van egy problémám, amire keresem a legegyszerűbb, legeffektívebb megoldást.
Leírom a helyzetet:
Elemeket kell tárolni az adatbázisban, minden elemhez hozzá van rendelve egy helyszín és egy kategória. A helyszín 3 szintes hierarchiával (megye, járás, község) a kategória n szintes hierarchiával (feltehetőleg 2-4, de akár mélyebb szint is előfordulhat) rendelkezik. A cél, hogy az elemeket szűrni lehessen kategória és helyszín szerint is, méghozzá a hierarchia bármelyik szintje szerint (pl megye vagy járás összes elemét íra ki) és ezt adott sorrendben (dátum vagy egyéb attribútum) kapjuk vissza.
PHP-t és Doctrine2 ORM-et használok (a Doctrine számomra új) és weboldalról van szó.
Jelenleg itt tartok:
Kategória: tárolja az id-t, megnevezést, szülő-re és gyermekeire a hivatkozást, hivatkozik az alá tartozó elemekre
Helyszín: tárolja az id-t, megnevezést, gps koordinátákat szülő-re és gyermekeire a hivatkozást, hivatkozik az alá tartozó elemekre
Na most eddig ez olyan egyszerűnek tűnt, hiszen kényelmesen kilistázhatom, rendezhetem, szűrhetem bármelyik kategória és helyszín elemeit, a probléma viszont az, hogy csak a közvetlenül hozzá tartozó elemeket. Én viszont rekurzívan szeretném - pl a kategória és az összes hozzá tartozó alkategória elemét. Ezt eddig úgy képzeltem el, hogy végigpásztázza az alkategóriákat és egy nagy ArrayCollection-ba menti az összes alkategória elemét, igenám csakhogy ez nincs megfelelően rendezve, ennek PHP-ben való rendezése, szűrése nagy overheaddel járna, továbbá elég gány lenne. Lehetőleg a Doctrine és az adatbázis erejével szeretném ezt megoldani.
Keresgettem nested-set pluginokat, érdekesnek tűnnek, de nem jöttem rá, hogy oldhatnám meg ezt velül.
Milyen megoldást javasoltok?
Hozzászólások
Én első körben (ha nem túl nagy fáról beszélünk) a hierarchiát nested setben tárolnám, és a szűrésnél IN-nel vizsgálnám a kiválasztott elemet és összes gyermekét.
https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/tree.md
Persze ennél azért vannak szebb megoldások is.
köszönöm, megpróbálom.