通过手动定义的连接表按关联查找

我知道这里有一个更简单的例子:

不幸的是,我的情况比这更复杂一点。 我有一个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模型。 他们通过一个手工定义的连接表(为每个唯一的关系添加一个职位,即用户A是部门B中的“经理”)相关联。 尝试按部门查找用户失败,表名错误。

续集版本“^ 2.0.5”

花了几个小时,但我发现我的解决scheme:

 models.department.find({ where: {id:req.params.id}, include: [models.user] 

问题是Sequelize不会让你“超出范围”,因为它开始每个where子句与model_name 。 所以,例如,当部门表只作为departments.idjoin时,where子句试图比较user.departments.id 。 由于我们正在查询部门(ID)的值,因此查询单个部门并返回关联的用户是最重要的。

我有类似的问题,但在我的情况下,我不能切换表。

我不得不使用: sequelize.literal函数。

在你的情况下,它将如下所示:

 models.user.findAll({ where: sequelize.literal("departments.id = " + req.params.id), include: [{model: models.department, as: models.department.tableName}] }) 

我不喜欢它,但它的作品。