Temat: Zapytanie hierarchiczne (id, parent_id)
Witam.
Może zacznę od opisu problemu.
potrzebuję pobrać z bazy dane z których utworzę menu w aplikacji.
Aplikacja korzysta z ACL dlatego pozycje w menu poiwnny się znaleźć tylko takie do których uzytkownik ma dostęp.
Menu jest dwu-poziomowe.
Czasem użytkownik może mieć dostęp do strony zarówno na pierwszym poziomie jak i do podstron. Innym razem może mieć dostęp tylko do podstron i wtedy muszę mu wygenerować na pierwszym poziomie przycisk bez linku natomiast na drugim poziomie przycisk z linkiem.
Wykombinowałem sobie, ze w bazie utworzę dwie tabele: resources, oraz roles_vs_resources.
poniżej definicje
CREATE TABLE resources
(
id integer NOT NULL DEFAULT nextval('menu_id_seq'::regclass),
id_parent integer,
label character varying(30) NOT NULL DEFAULT 'menu'::character varying,
module character varying(20),
controller character varying(20),
"action" character varying(20),
parameters character varying(100),
description character varying(100),
CONSTRAINT pkey_menu PRIMARY KEY (id),
CONSTRAINT unique_controller_action UNIQUE (controller, action),
CONSTRAINT unique_module_controller_action UNIQUE (module, controller, action)
)
WITH (
OIDS=FALSE
);
ALTER TABLE resources OWNER TO brif;
CREATE TABLE roles_vs_resources
(
id serial NOT NULL,
id_role integer NOT NULL,
id_resource integer NOT NULL,
CONSTRAINT pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE roles_vs_resources OWNER TO brif;
Chodzi o to, że chce pobrać z bazy tylko te zasoby do których użytkownik ( rola ) ma dostęp plus te które są rodzicem dla pozycji z dostępem. Dodam, że użytkownik może mieć też dostęp do zasobu który nie ma dzieci.
Mam nadzieję, że dokładnie wyjaśniłem o co mi chodzi.
W oraclu można by to pewnie zrobić jakimś zapytaniem hierarchicznym ,ale w PG nie mam pojęcia jak do tego dojść. Kombinowałem z subselektami, ale nie wychodzi.
Moze ktoś ma jakiś pomysł ?
Pozdrawiam