如何消除Sequelize中相同模型之间多个关联的歧义

时间:2018-02-06 16:08:58

标签: javascript join sequelize.js

我有三个模型 - BookUserInstitution - 彼此相关联,如下所示:

  • 图书通过Book_Institution联接表(多对多关系)与机构相关联

    Book.belongsToMany(models.Institution, { through: 'Book_Institution' })
    

    Institution.belongsToMany(models.Book, { through: 'Book_Institution' })
    
  • 用户可以通过两种方式与机构相关联:作为读者或作者。这是通过两个连接表完成的:Author_InstitutionReader_Institution

    Institution.belongsToMany(models.User, { through: 'Author_Institution' })
    Institution.belongsToMany(models.User, { through: 'Reader_Institution' })
    

    User.belongsToMany(models.Institution, { through: 'Author_Institution' })
    User.belongsToMany(models.Institution, { through: 'Reader_Institution' })
    

    (每次为了简洁而省略foreignKey。)

我想查询Book模型以查找属于作者的所有图书。 Sequelize提供了include选项,可以轻松连接两个关联的表。我正在处理的问题是,如下所示使用include默认为Reader_Institution关联。如何指定应使用哪种关联?

getBooks: (obj, args, context) => {
  const { user } = context

  return Book.findAll({
    attributes: ['id', 'path'],
    include: [{
      include: [{
        attributes: ['id'],
        model: User,
        where: { id: user }
      }],
      model: Institution,
      required: true // inner join
    }]
  })
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我使用as,允许您通过该别名引用关系。

Institution.belongsToMany(models.User, { 
    through: 'Author_Institution', // many-to-many relationship table name
    as: 'AuthorInstitution' // alias
})

通过这种方式设置模型,您可以使用as指定查询时要包含的关系。

getBooks: (obj, args, context) => {
  const { user } = context

  return Book.findAll({
    attributes: ['id', 'path'],
    include: [{
      include: [{
        attributes: ['id'],
        model: User,
        where: { id: user },
        as: 'AuthorInstitution'
      }],
      model: Institution,
      required: true // inner join
    }]
  })
}

此外,通过此方法,您可以通过as引用关系数据,这样您就可以book.AuthorInstitution,它将是该对象的价值。