我知道有一个更简单的案例描述here:
不幸的是,我的情况比这复杂一点。我有一个用户模型belongsToMany
部门(反过来belongsToMany
用户),但是通过userDepartment
,这是一个手动定义的连接表。 我的目标是让所有用户都属于某个部门。首先让我们看一下models/user.js
:
var user = sequelize.define("user", {
id: {
type: DataTypes.INTEGER,
field: 'emplId',
primaryKey: true,
autoIncrement: false
},
firstname: {
type: DataTypes.STRING,
field: 'firstname_preferred',
defaultValue: '',
allowNull: false
}
...
...
...
associate: function(models) {
user.belongsToMany(models.department, {
foreignKey: "emplId",
through: 'userDepartment'
});
})
}
...
return user;
现在,看看models/department.js
:
var department = sequelize.define("department", {
id: {
type: DataTypes.INTEGER,
field: 'departmentId',
primaryKey: true,
autoIncrement: true
},
...
classMethods: {
associate: function(models) {
department.belongsToMany(models.user, {
foreignKey: "departmentId",
through: 'userDepartment',
onDelete: 'cascade'
});
}
...
return department;
最后在models/userDepartment.js
:
var userDepartment = sequelize.define("userDepartment", {
title: {
type: DataTypes.STRING,
field: 'title',
allowNull: false,
defaultValue: ''
}
}, {
tableName: 'user_departments'
});
return userDepartment;
到目前为止一切顺利。但是,这个查询:
models.user.findAll({
where: {'departments.id': req.params.id},
include: [{model: models.department, as: models.department.tableName}]
})
失败,出现以下错误:
SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Unknown column 'user.departments.id' in 'where clause'
尝试将userDepartment模型结果包括在内:
Error: userDepartment (user_departments) is not associated to user!
简而言之:我有两个与M:M关系的Sequelize Models。它们通过手动定义的连接表关联(它将作业标题添加到每个唯一关系,即,用户A是部门B中的“管理器”)。尝试按部门查找用户失败,表名错误。
续集版“^ 2.0.5”
答案 0 :(得分:3)
花了几个小时,但我找到了解决办法:
models.department.find({
where: {id:req.params.id},
include: [models.user]
问题在于Sequelize不会让你“超出范围”,因为它会以model_name
开始每个where子句。因此,例如,当departments表仅作为user.departments.id
加入时,where子句尝试比较departments.id
。由于我们正在查询部门的值(ID),因此查询单个部门并返回其关联用户的次数最多。
答案 1 :(得分:3)
我遇到了类似问题,但就我而言,我无法转换表格。
我必须使用:models.user.findAll({
where: sequelize.literal("departments.id = " + req.params.id),
include: [{model: models.department, as: models.department.tableName}]
})
函数。
在您的情况下,它将如下所示:
{{1}}
我不喜欢它,但它有效。
答案 2 :(得分:-1)