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

bre*_*gly 5 node.js sequelize.js

我知道这里描述了一个更简单的情况:

不幸的是,我的情况比这更复杂一些。我有一个用户模型,其中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;
Run Code Online (Sandbox Code Playgroud)

现在,看一下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;
Run Code Online (Sandbox Code Playgroud)

最后在models/userDepartment.js

var userDepartment = sequelize.define("userDepartment", {
    title: {
        type: DataTypes.STRING,
        field: 'title',
        allowNull: false,
        defaultValue: ''
    }
}, {
    tableName: 'user_departments'
});

return userDepartment;
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。然而,这个查询:

models.user.findAll({
    where: {'departments.id': req.params.id},
    include: [{model: models.department, as: models.department.tableName}]

})
Run Code Online (Sandbox Code Playgroud)

失败并出现以下错误:

SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Unknown column 'user.departments.id' in 'where clause'
Run Code Online (Sandbox Code Playgroud)

尝试包含 userDepartment 模型结果:

Error: userDepartment (user_departments) is not associated to user!
Run Code Online (Sandbox Code Playgroud)

简而言之:我有两个具有 M:M 关系的 Sequelize 模型。它们通过手动定义的联接表关联起来(该表为每个唯一关系添加职位,即用户 A 是部门 B 中的“经理”)。尝试按部门查找用户失败,并出现错误的表名错误。

续集版本“^2.0.5”

bre*_*gly 3

花了几个小时,但我找到了解决方案:

models.department.find({
    where: {id:req.params.id},
    include: [models.user]
Run Code Online (Sandbox Code Playgroud)

问题是 Sequelize 不会让你“超出范围”,因为它以model_name. 因此,例如,where 子句尝试比较user.departments.id当 Departments 表仅连接为 时departments.id。由于我们正在查询部门的值(ID),因此最多可以查询单个部门并返回其关联的用户。