Sequelize вложенные нетерпеливые загрузки найти все, где вложенные ассоциации не совпадают - PullRequest
0 голосов
/ 06 июля 2018

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

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

1 Ответ

0 голосов
/ 12 июля 2018

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

Чтобы прояснить мой вопрос, эта схема mysql типов соединения изображает мой сценарий как Anti Semi Join .

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

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

...