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

时间:2015-05-18 16:17:20

标签: node.js sequelize.js

我知道有一个更简单的案例描述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”

3 个答案:

答案 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)

对于仍在寻找答案的任何人,我在Github上找到了一个。

您只需执行以下操作:

where: {
   '$Table.column$' : value
 }