我有三个模型 - Book
,User
和Institution
- 彼此相关联,如下所示:
图书通过Book_Institution
联接表(多对多关系)与机构相关联
Book.belongsToMany(models.Institution, { through: 'Book_Institution' })
和
Institution.belongsToMany(models.Book, { through: 'Book_Institution' })
用户可以通过两种方式与机构相关联:作为读者或作者。这是通过两个连接表完成的:Author_Institution
和Reader_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
}]
})
}
提前感谢您的帮助。
答案 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
,它将是该对象的价值。