Здравствуйте. Подскажите пожалуйста. Как правильно решать такой кейс:
1) есть табличка с пользователями, но пользователи могут принадлежать другим пользователям
CREATE TABLE public."Users" (
id serial NOT NULL,
"parentId" int4 NULL,
email varchar(100) NOT NULL DEFAULT ''::character varying,
CONSTRAINT "Users_email_key" UNIQUE (email),
CONSTRAINT "Users_pkey" PRIMARY KEY (id),
CONSTRAINT "Users_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "Users"(id) ON DELETE CASCADE,
);
2) Есть таблица "Cartridges" которая имеет связь с таблицей пользователей по полю "userId".
Редактировать, просматривать запись может только или непосредственно сам пользователь или его родитель
CREATE TABLE public."Cartridges" (
id serial NOT NULL,
code varchar(9) NOT NULL DEFAULT ''::character varying,
printed int4 NOT NULL DEFAULT 0,
"userId" int4 NULL,
CONSTRAINT "Cartridges_pkey" PRIMARY KEY (id),
CONSTRAINT "Cartridges_userId_fkey" FOREIGN KEY ("userId") REFERENCES "Users"(id) ON DELETE CASCADE
);
Делаю через добавление CTE к каждому запросу, который рекурсивно создает табличку с пользователем и его родителем, а далее уже соединением проверяем есть ли он там.
WITH RECURSIVE "UsersTree" AS (
SELECT
id,
email,
"parentId"
FROM "Users"
WHERE id = 4
UNION ALL
SELECT
"Users".id,
"Users".email,
"Users"."parentId"
FROM "Users"
INNER JOIN "UsersTree" ON "Users"."parentId" = "UsersTree".id
)
update "Cartridges" set printed = 5
from "UsersTree" where "Cartridges".id = 2 and "UsersTree".id = "Cartridges"."userId"
returning *
Но как-то громоздкая выходит конструкция, которую нужно добавлять к каждому запросу. Как в таких случаях деают. Спасибо