我在我的MSQL表中有一个多对多的关系,涉及以下两个模型:
- Venue - 代表一个场馆,可以拥有多个所有者(员工)
- Employee - 代表可以是CEO或销售员工等的员工。
我正在使用Sequelize设置关系,如下所示:
Employee > Venue 关系
Employee.associate = function (models) {
models.Employee.belongsToMany(models.Venue, { through: 'EmployeeVenues' })
}
关系场地 > 员工
Venue.associate = function (models) {
models.Venue.belongsToMany(models.Employee, { through: 'EmployeeVenues' })
}
根据Sequelize文档,它将创建一个名为EmployeeVenues的新模型,其中包含等效的外键employee_id和venue_id。定义through是必需的。Sequelize以前会尝试自动生成名称,但这不总是导致最合乎逻辑的设置。这将添加方法getVenues、setVenues、addVenue、addUsers到Employee。此操作能够正常运行,当我启动我的Sequelize时,它会创建一个名为EmpoyeeVenues的新表,具有正确的复合键作为外键。然而,当我查询getVenues时,它不返回预期的输出。相反,它返回了关联表的值,而我不想要。获取id等于1的员工所属的所有场馆的查询:router.get('/api/v1/users/:employee_id/venues', (request, response) => {
var employeeId = request.params.employee_id;
models.Employee.findOne({
where: {id: employeeId}
}).then((employee) => {
if(!employee) { return response.status(400).send("Employee doesnt have a venue registered yet.")}
var venues = employee.getVenues().then((venues) => {
response.status(200).send(venues);
})
})
});
响应结果
[
{
"id": 1,
"capacity": "11",
"venue_name": "Club Fix",
"venue_description": "Club in Tilburg",
"EmployeeVenues": {
"employee_id": 1,
"venue_id": 1
}
},
{
"id": 2,
"capacity": "400",
"venue_name": "Club Vie",
"venue_description": "Club in Rotterdam",
"EmployeeVenues": {
"employee_id": 1,
"venue_id": 2
}
}
]
问题
为什么Sequelize提供的查询中包含EmployeeVenues?如何防止EmployeeVenues被包含在响应中?
更新
根据Sequelize GitHub页面上于2014年发布的一个问题,有一个解决方案可行。
https://github.com/sequelize/sequelize/issues/2143
User.find({
where: {id: userId}, attributes: userFields,
include: [
{model: db.Role, attributes: roleFields, through: {attributes: []}}
]
});
但是它与Sequelize文档中的记录版本不匹配,该文档应该是最新的。
User.findAll({
include: [{
model: Project,
through: {
attributes: ['createdAt', 'startedAt', 'finishedAt'],
where: {completed: true}
}
}]
});
甚至可以在参考文档中简单说明:
user.getPictures() // gets you all pictures