Я пытаюсь настроить модуль пользовательских разрешений на нашем сайте, и я относительно новичок в продолжении и выполнении основных вложенных операций загрузки.
У меня есть три модели: 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 }}
Это не работает. Возьмем, к примеру, запрос на получение всех разрешений, которые Пользователь1 был «Запрещен». Если бы у User1 было Permission1, а у User2 также было Permission1, каталог Permission1 получил бы все разрешения, у которых были пользователи, которые не были User1. Поскольку User2 был связан с Permission1 и User1.id != User2.id, Permission1 будет включен в ответ.
Однако я могу получить желаемый эффект, сначала запросив все разрешения, имеющие идентификатор пользователя, составив список их идентификаторов, а затем выполнив второй запрос, который получает разрешения, идентификатор которых отсутствует в этом списке ... но это требует двух вызовов, а не одного.
Tl; dr Я ищу способ сделать вложенный запрос загрузки с каталогами разрешений на верхнем уровне, который будет возвращать только каталоги / разрешения, с которыми НЕ связан данный пользователь.


После долгого изучения интернета и множества тупиков, я думаю, что знаю неудачный ответ на вопрос: sequelize не очень хорош для построения сложных запросов.
Чтобы добавить ясности к моему вопросу, этот план типы соединения mysql изображает мой сценарий как Анти-Полусоединение.
Чтобы выполнить этот sql-запрос в продолжении, мне нужно было бы иметь возможность выполнить подзапрос, который, похоже, изначально не поддерживается sequelize (исходя из отсутствия движения по проблеме # 3961).
Использование sequelize.literal внутри оператора where, кажется, отлично подходит для моих нужд, но было бы неплохо, если бы sequelize с самого начала включил все типы соединений в свои функции, а не только поддерживал внутренние и левые соединения. Мне кажется, это своего рода оплошность.
Вы придумали что-то еще к этому? Я ищу способ использовать условие where для столбцов eager nested.
Достигнут некоторый прогресс, пытаясь строить запросы более непосредственно, следуя некоторым методам, описанным в этом проблема. Кажется, что у sequelize могут быть некоторые недостатки, когда дело доходит до построения запросов.