Sequelize нетерпеливая нагрузка не фильтруется правильно с вложенными ассоциациями - PullRequest
0 голосов
/ 17 января 2020

Я использую Sequelize с существующей базой данных и имею следующее отношение:

EntityA -N: M-> EntityB -N: M-> EntityC

Моя база данных содержит таблицы:

EntityA
EntityB
EntityC

EntityA_EntityB ('entity_a_id', 'entity_b_id')
// Redundant fields in this one I know but wasn't sure on the model
EntityA_EntityB_EntityC ('entity_a_id', 'entity_b_id', 'entity_c_id', 'entity_a_entity_b_id') 

и запрос как таковой

EntityA.findAll({
    include: {
        model: EntityB,
        include: EntityC
    }

Это дает корректно выглядящую модель:

  EntityA[
      EntityB: [
           EntityC: []
     ]
  ]   

Однако Entity C содержит данные, которые не учитывают ограничение принадлежности к EntityA. Например, у меня может быть «AB C» в EntityC для EntityA_EntityB с entity_a_id из 1 и при получении графика для entity_a_id из 2 , все EntityC, относящиеся к EntityB независимо от EntityA, извлекаются.

Надеюсь, я объяснил это достаточно последовательно, так как это довольно запутанная вещь для описания.

Мои ассоциации следующие:

// Works great
EntityA.belongsToMany(EntityB, { through: EntityAEntityB, foreignKey: 'entity_a_id' })
EntityB.belongsToMany(EntityA, { through: EntityAEntityB, foreignKey: 'entity_b_id' })

// Not so much

// Need this to also stress that EntityA must match on EntityEntityBEntityC table!
EntityC.belongsToMany(EntityB, { through: { EntityAEntityBEntityC }, foreignKey: 'entity_c_id' })
EntityB.belongsToMany(EntityC, { through: { EntityAEntityBEntityC }, foreignKey: 'entity_b_id' })

// Not so sure on this one?
EntityA.belongsToMany(EntityC, { through: { EntityAEntityBEntityC }, foreignKey: 'entity_a_id' })
EntityC.belongsToMany(EntityA, { through: { EntityAEntityBEntityC }, foreignKey: 'entity_c_id' })

Я попробовал следующее безуспешно:

EntityC.belongsToMany(EntityAEntityB, through: { EntityAEntityBEntityC }, foreignKey: 'entity_a_entity_b_id')
EntityAEntityB.belongsToMany(EntityC, through: { EntityAEntityBEntityC }, foreignKey: 'entity_c_id')

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

EntityA.findByPk(id, {
    include: {
        model: EntityB,
        include: {
            model: EntityC,
            through: { where: entity_a_id: id }
        }
    }

Однако у меня есть сценарий ios, где я запрашиваю другую сущность, которая содержит 1: M EntityA.

User.findByPk(1, {
    include: {
        model: EntityA,
        include:....

И так, у меня нет данных для запроса.

Я изучил документы по сиквелизу и другие посты SO, которые имели схожие модели с моими, но их решения, к сожалению, не сработали. Я полагаю, что это может быть связано с тем, что у меня есть готовая база данных и мне пришлось явно моделировать таблицы ссылок, но я не уверен. Как я могу заставить sequelize принуждать ON entity_a_id = {X} при присоединении к Entity C? Буду признателен за любые рекомендации.

...