我的 MSQL 表中这两个模型之间存在多对多关系:
- 场所 - 代表可以有多个所有者(员工)的场所
- 员工 - 代表员工,可以是首席执行官或销售员工或任何其他人员。
我在用续集 /questions/tagged/sequelize像这样建立关系:
关系员工 > 地点
Employee.associate = function (models) {
models.Employee.belongsToMany(models.Venue, { through: 'EmployeeVenues' })
}
联系地点 > 员工
Venue.associate = function (models) {
models.Venue.belongsToMany(models.Employee, { through: 'EmployeeVenues' })
}
续集文档
根据续集文档 http://docs.sequelizejs.com/manual/tutorial/associations.html它将创建一个名为 EmployeeVenues 的新模型,其具有等效的外键employee_id 和venue_id。需要定义通过。 Sequelize 以前会尝试自动生成名称,但这并不总是会导致最合乎逻辑的设置。这将添加方法获取场地、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
}
}
]
Question
为什么 EmployeeVenues 包含在 Sequelize 提供的此查询中?如何防止 EmployeeVenues 包含在响应中?
Update
根据 2014 年 Sequelize github 页面上的一个问题,有一个可行的解决方案
https://github.com/sequelize/sequelize/issues/2143 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}
}
}]
});
或者甚至简单地说明参考文档: http://docs.sequelizejs.com/class/lib/associations/base.js~Association.html
user.getPictures() // gets you all pictures