Sequelize nested eager loading найти все, где вложенная ассоциация не соответствует

Я пытаюсь настроить модуль пользовательских разрешений на нашем сайте, и я относительно новичок в продолжении и выполнении основных вложенных операций загрузки.

У меня есть три модели: 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 могут быть некоторые недостатки, когда дело доходит до построения запросов.

jarommadsen 12.07.2018 01:05
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
1 138
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После долгого изучения интернета и множества тупиков, я думаю, что знаю неудачный ответ на вопрос: sequelize не очень хорош для построения сложных запросов.

Чтобы добавить ясности к моему вопросу, этот план типы соединения mysql изображает мой сценарий как Анти-Полусоединение.

Чтобы выполнить этот sql-запрос в продолжении, мне нужно было бы иметь возможность выполнить подзапрос, который, похоже, изначально не поддерживается sequelize (исходя из отсутствия движения по проблеме # 3961).

Использование sequelize.literal внутри оператора where, кажется, отлично подходит для моих нужд, но было бы неплохо, если бы sequelize с самого начала включил все типы соединений в свои функции, а не только поддерживал внутренние и левые соединения. Мне кажется, это своего рода оплошность.

Вы придумали что-то еще к этому? Я ищу способ использовать условие where для столбцов eager nested.

BartusZak 02.12.2019 07:03

Другие вопросы по теме