我正在尝试通过sequelize执行查询。我有4个表: userInfo (包含外键(“group_id”)), group_user (包含有关用户组的信息),权限(其中包含有关权限的信息),最后是连接表 group_privileges (在表group_user和权限上有2个外键)
模型定义
userInfo.js中定义的模型
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,
});
};
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('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;
(...这里的问题是:...... ON“group_privileges”。“ id ”...而不是 ... ON“group_privileges”。“ group_id ”)
如您所见,我正在尝试强制group_privileges.userInfos和group_privileges的特定字段的连接条件。但由于我无法弄清楚的原因,它需要将group_privileges表的“ id ”字段改为使用此表的“ group_id ”字段。
有没有人可以告诉我,我做错了什么,或者sequelize模块是否存在问题/错误?如果我做错了什么,你能告诉我究竟是什么以及解决方案是什么?
非常感谢您的回答。
方言:postgres
数据库版本:9.4.4
Sequelize版本:3.23.0