Javascript 在node.js上使用sequelize时如何将表与特定字段联接
我正试图通过sequelize执行一个查询。我有4个表:userInfo(其中包含一个外键(“组id”))、group\u user(其中包含有关用户组的信息)、privilege(其中包含有关特权的信息)以及最后一个联接表组特权(在表组\用户和权限上有2个外键) 模型定义 在userInfo.js中定义的模型Javascript 在node.js上使用sequelize时如何将表与特定字段联接,javascript,node.js,postgresql,sequelize.js,Javascript,Node.js,Postgresql,Sequelize.js,我正试图通过sequelize执行一个查询。我有4个表:userInfo(其中包含一个外键(“组id”))、group\u user(其中包含有关用户组的信息)、privilege(其中包含有关特权的信息)以及最后一个联接表组特权(在表组\用户和权限上有2个外键) 模型定义 在userInfo.js中定义的模型 module.exports = function(sequelize, DataTypes) { return sequelize.define('userInfo', {
module.exports = function(sequelize, DataTypes) {
return sequelize.define('userInfo', {
username: {
type: DataTypes.TEXT,
allowNull: true
},
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
group_id: {
type: DataTypes.INTEGER,
allowNull: true,
defaultValue: '1',
references: {
model: 'group_user',
key: 'id'
}
}
}, {
tableName: 'userInfo',
underscored: true,
freezeTableName: true,
});
};
在group_privilege.js中定义的模型
module.exports = function(sequelize, DataTypes) {
return sequelize.define('group_privilege', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
group_id: {
type: DataTypes.INTEGER,
allowNull: false,
references: {
model: 'group_user',
key: 'id'
}
},
privilege_id: {
type: DataTypes.INTEGER,
allowNull: false,
references: {
model: 'privilege',
key: 'id'
}
}
}, {
tableName: 'group_privilege',
underscored: true,
freezeTableName: true,
});
};
module.exports = function(sequelize, DataTypes) {
return sequelize.define('privilege', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
description: {
type: DataTypes.TEXT,
allowNull: true
},
code: {
type: DataTypes.TEXT,
allowNull: false,
defaultValue: 'N/D'
}
}, {
tableName: 'privilege',
underscored: true,
freezeTableName: true,
});
};
在group_user.js中定义的模型
module.exports = function(sequelize, DataTypes) {
return sequelize.define('group_user', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: DataTypes.TEXT,
allowNull: true
},
description: {
type: DataTypes.TEXT,
allowNull: true
}
}, {
tableName: 'group_user',
underscored: true,
freezeTableName: true,
});
};
privilege.js中定义的模型
module.exports = function(sequelize, DataTypes) {
return sequelize.define('group_privilege', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
group_id: {
type: DataTypes.INTEGER,
allowNull: false,
references: {
model: 'group_user',
key: 'id'
}
},
privilege_id: {
type: DataTypes.INTEGER,
allowNull: false,
references: {
model: 'privilege',
key: 'id'
}
}
}, {
tableName: 'group_privilege',
underscored: true,
freezeTableName: true,
});
};
module.exports = function(sequelize, DataTypes) {
return sequelize.define('privilege', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
description: {
type: DataTypes.TEXT,
allowNull: true
},
code: {
type: DataTypes.TEXT,
allowNull: false,
defaultValue: 'N/D'
}
}, {
tableName: 'privilege',
underscored: true,
freezeTableName: true,
});
};
以下是我正在执行的查询代码:
var privilege = Mysequelize.import(path.join(process.cwd() + "/models/privilege.js"));
var group_privilege = Mysequelize.import(path.join(process.cwd() + "/models/group_privilege.js"));
var userInfo = Mysequelize.import(path.join(process.cwd() + "/models/userInfo.js"));
var group_user = Mysequelize.import(path.join(process.cwd() + "/models/group_user.js"));
group_privilege.belongsTo(privilege, {foreignKey:'privilege_id', targetKey:"id"});
privilege.hasMany(group_privilege, {foreignKey:'privilege_id', targetKey:"id"});
userInfo.belongsTo(group_privilege, {foreignKey:'group_id', targetKey:'group_id'});
group_privilege.hasOne(userInfo, {foreignKey:'group_id', targetKey:'group_id'});
Mysequelize.sync().then(function(){
privilege.findAll({include:[{model:group_privilege, include:{model:userInfo, where: id:req.user.id}}}]}).then(function(final_priv){
var list_of_privileges = [];
for (var key in final_priv){
list_of_privileges.push(final_priv[key].dataValues.id);
}
res.type('application/json').status(200).send({"userPrivileges":list_of_privileges});
}).catch(function(err){
return next(err)});
}).catch(function(err){
var errMsg = "Error while getting user privileges in database: " + err;
console.log(errMsg);
res.status(500).send(errMsg);
});
}).catch(function(err){
return next('Unable to connect to the database:' + err);
});
我预计会发生什么?
理想的输出查询是:
SELECT "privilege"."id",
"privilege"."description",
"privilege"."code"
FROM "privilege" AS "privilege"
INNER JOIN "group_privilege" AS "group_privileges" ON "privilege"."id" = "group_privileges"."privilege_id"
INNER JOIN "userInfo" AS "group_privileges.userInfos" ON "group_privileges"."group_id" = "group_privileges.userInfos"."group_id"
WHERE "group_privileges.userInfos".id = 15;
注意,在WHERE条件下,数字15只是一个动态id
数字。我们不需要关注这个值
实际发生了什么?
启用日志选项时,我们可以看到执行的SQL查询是:
SELECT "privilege"."id",
"privilege"."description",
"privilege"."code",
"group_privileges"."id" AS "group_privileges.id",
"group_privileges"."group_id" AS "group_privileges.group_id",
"group_privileges"."privilege_id" AS "group_privileges.privilege_id",
"group_privileges.userInfos"."username" AS "group_privileges.userInfos.username",
"group_privileges.userInfos"."id" AS "group_privileges.userInfos.id",
"group_privileges.userInfos"."group_id" AS "group_privileges.userInfos.group_id"
FROM "privilege" AS "privilege"
LEFT OUTER JOIN "group_privilege" AS "group_privileges" ON "privilege"."id" = "group_privileges"."privilege_id"
INNER JOIN "userInfo" AS "group_privileges.userInfos" ON "group_privileges"."id" = "group_privileges.userInfos"."group_id" AND "group_privileges.userInfos"."id" = 15;
我的问题是最后一次加入。而不是:
INNER JOIN "userInfo" AS "group_privileges.userInfos" ON "group_privileges"."group_id" = "group_privileges.userInfos"."group_id" AND "group_privileges.userInfos"."id" = 15;
我有
INNER JOIN "userInfo" AS "group_privileges.userInfos" ON "group_privileges"."id" = "group_privileges.userInfos"."group_id" AND "group_privileges.userInfos"."id" = 15;
(…这里的问题是:…关于“组权限”。id“…而不是
…关于“组权限”。组id)
如您所见,我正试图在group_privileges.userInfos和group_privileges的特定字段上强制执行联接条件。但由于某种原因,我无法确定,它使用group_privileges表的“id”字段来代替此表的“group_id”字段
是否有人能告诉我我做错了什么,或者sequelize模块是否存在问题/错误?如果我做错了什么,您能告诉我具体的解决方案吗
非常感谢你的回答
方言:postgres
数据库版本:9.4.4
续集版本:3.23.0