Sequelize n:m join table 1:m eager loading relationship

时间:2016-06-06 17:34:24

标签: sequelize.js

在sequelize文档中有一个例子如下(我有一个类似的用例)。

 ItemTag = sequelize.define('item_tag', {
  tag_id: {
    type: DataTypes.INTEGER,
    unique: 'item_tag_taggable'
  },
  taggable: {
    type: DataTypes.STRING,
    unique: 'item_tag_taggable'
  },
  taggable_id: {
    type: DataTypes.INTEGER,
    unique: 'item_tag_taggable',
    references: null
  }
});
Tag = sequelize.define('tag', {
  name: DataTypes.STRING
});

Post.belongsToMany(Tag, {
  through: {
    model: ItemTag,
    unique: false,
    scope: {
      taggable: 'post'
    }
  },
  foreignKey: 'taggable_id',
  constraints: false
});
Tag.belongsToMany(Post, {
  through: {
    model: ItemTag,
    unique: false
  },
  foreignKey: 'tag_id'
});

现在,让我说我必须包含一个额外的关系和表格:

ItemTagReaction = sequelize.define('item_tag_reaction', {
  reaction_type: {
     type: Sequelize.ENUM.apply(Sequelize, reactionTypes),
  },
  tagResponse: Sequelize.STRING(256),
});

现在,我在这里添加了一个额外的关系:

ItemTag.hasMany(ItemTagReaction);

在查询Post时如何eagerload ItemTagReaction?

Post.findById(2, {
  include: [Tag],
})

上面的^^有效,但我不知道如何确保还加载了ItemTagReaction。如果包含它,则会收到与Post无关的错误。如果你尝试将它包含在Tag中,你就会得到一个错误,它们也没有关系。

帮助!?

1 个答案:

答案 0 :(得分:0)

在您的定义中,Post与Tag相关。但Post和Tag都没有与ItemTagReaction和ItemTag相关联。

您必须将ItemTagReaction与帖子或标签相关联。然后你可以包括它(Post)或嵌套包含它(Tag)。