Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在node.js上使用sequelize时如何将表与特定字段联接_Javascript_Node.js_Postgresql_Sequelize.js - Fatal编程技术网

Javascript 在node.js上使用sequelize时如何将表与特定字段联接

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', {

我正试图通过sequelize执行一个查询。我有4个表:userInfo(其中包含一个外键(“组id”))、group\u user(其中包含有关用户组的信息)、privilege(其中包含有关特权的信息)以及最后一个联接表组特权(在表组\用户和权限上有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,
  });
};
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