Я пытаюсь настроить модуль пользовательских разрешений на нашем сайте, и я относительно новичок в секвелировании и в том, как выполнять базовые операции вложенной загрузки.
У меня есть три способа настройки: Permission
, PermissionDirectory
и User
. Разрешения находятся в списке, вложенном в их отношение belongsTo
с каталогом. У меня есть фильтр в списке, который фильтрует, является ли пользователь "Разрешено" или "Отклонено" разрешение. Пользователи имеют отношение «многие ко многим» с разрешениями, и я определяю, имеют ли они «Разрешенные» разрешения, если между ними существует связь.
Страница, о которой идет речь, предназначена для фильтрации разрешений конкретного пользователя. Фильтрация того, разрешено ли пользователю разрешение, достаточно проста:
const directories = await models.PermissionDirectory.findAll({
limit,
offset,
where: { ["$permissions.users.id$"], userId },
include: [
{
model: models.Permission,
include: [{
model: models.User
}]
},
]
});
return directories;
Но фильтрация по «Отклонено» оказалась трудной. Выполнение противоположного условия вернет разрешения, которые есть у других пользователей, вместо того, чтобы возвращать разрешения, которые не имеет целевой пользователь (указанный в параметре userId
).
where: { ["$permissions.users.id$"], { [Op.ne]: userId }}
Это не работает. Возьмите пример, если бы я запрашивал, чтобы получить все разрешения User1 был «Отклонен». Если бы User1 имел Permission1, а User2 также имел Permission1, каталог Permission1 получал бы все разрешения, которые имели пользователи, которые не были User1. Поскольку User2 был связан с Permission1 и User1.id != User2.id
, Permission1 будет включен в ответ.
Однако я могу получить желаемый эффект, сначала запросив все разрешения, имеющие userId, составив список их идентификаторов, а затем выполнив второй запрос, который получает разрешения, чей идентификатор отсутствует в этом списке. ... но для этого требуется два вызова, а не один.
Tl; dr Я ищу способ сделать вложенный нетерпеливый запрос на загрузку с каталогами разрешений на верхнем уровне, который будет возвращать только каталоги / разрешения, с которыми данный пользователь НЕ связан.