Node.js 仅从sequelize连接模型返回指定的关联模型
我正试图正确地使用sequelize查询来处理graphql+apollo 这是我的Node.js 仅从sequelize连接模型返回指定的关联模型,node.js,postgresql,graphql,sequelize.js,apollo,Node.js,Postgresql,Graphql,Sequelize.js,Apollo,我正试图正确地使用sequelize查询来处理graphql+apollo 这是我的Poolgql模式: type Pool { id: ID! name: String! createdBy: User members: [User] } 下面是池模型关联 Pool.associate = models => { Pool.belongsToMany(models.User, { onDelete: 'CASCADE',
Pool
gql模式:
type Pool {
id: ID!
name: String!
createdBy: User
members: [User]
}
下面是池模型关联
Pool.associate = models => {
Pool.belongsToMany(models.User, {
onDelete: 'CASCADE',
through: models.UserPool,
foreignKey: models.UserPool.poolId,
})
}
对于用户
模式:
模型协会
User.associate = models => {
User.belongsToMany(models.Pool, {
onDelete: 'CASCADE',
through: models.UserPool,
foreignKey: 'userId',
})
}
这两个模型通过一个称为
UserPool
仅存储User
和Pool
的PK
在我的/resolvers/pool.js
中,我正在为池定义gql模型解析器。
这就是我的问题所在。
在下面的成员
字段中,我只想返回用户
对象,我可以通过UserPool
Pool: {
createdBy: async (pool, _, { models }) => {
// this sequelize built-in works and returns the createdBy User model
const user = await pool.getUser()
return user
},
members: async (pool, _, { models }) => {
let users = []
const poolUsers = await models.UserPool.findAll({
where: { poolId: pool.id },
})
// *** below is what I want to do -- use the in-built ***
// *** sequelize query methods you get with the n:m assoc ***
const users = await poolUsers.getUsers()
// However, each time this throws an error:
// getUsers() is not a function....
return users
},
},
下面是我的UserPool模型关联定义:
UserPool.associate = models => {
UserPool.belongsTo(models.User, {
onDelete: 'CASCADE',
foreignKey: 'userId',
})
UserPool.belongsTo(models.Pool, {
onDelete: 'CASCADE',
foreignKey: 'poolId',
})
}
我试图在Sequelize中使用自动方法,但它们似乎不起作用
您只需执行以下操作:
models.User.findAll({
include: [{
model: models.UserPool,
where: { poolId: pool.id },
required: true
}]
poolUsers
是一个UserPool对象数组,因此它没有getUsers
方法。您可以映射每个用户池并获取用户,但这将导致对数据库的不必要的大量调用
您已经在池
和用户
之间创建了关联。所以你可以直接做
members: async (pool) => {
return pool.getUsers()
}
事实上我才意识到这一点。我在我的models/pool.js
文件中定义了一个无关的关联:facepalm:但是是的,这是正确的。谢谢
members: async (pool) => {
return pool.getUsers()
}