通过手动定义的连接表按关联查找
我知道这里有一个更简单的例子:
不幸的是,我的情况比这更复杂一点。 我有一个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.id
join时,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}] })
我不喜欢它,但它的作品。