mysql - 使用关联和外键对 findAll 进行后续处理

标签 mysql node.js orm sequelize.js

我正在使用 sequelize 在我的 Node 应用程序中对 mySql 数据库模式进行建模。假设我有 3 个表:项目、用户和角色。

它是项目和用户之间的“多对多”关联,通过“Project_User”定义了项目用户的角色。

项目模型:

var Project = sequelize.define('Project', {
    name:{type: DataTypes.STRING, unique: true}
},
classMethods: {
   associate: function(models) {
       Project.belongsToMany(models.User, { through: 'Project_User', as: 'users'});
   }
}
// Methods...
);

用户模型:

var User= sequelize.define('User', {
    name:{type: DataTypes.STRING, unique: true}
},
classMethods: {
   associate: function(models) {
       User.belongsToMany(models.Project, { through: 'Project_User', as: 'projects'});
   }
}
// Methods...
);

这是关联表Project_User Model:

var Project_User = sequelize.define('Project_User', {
    role:
    {
        type: DataTypes.INTEGER,
        allowNull: false,
        references: 'Role',
        referencesKey: 'id'
    }
},{
    classMethods: {
        associate: function(models) {
            Project_User.belongsTo(models.Role, {foreignKey: 'role'});
        }
    }
});

现在,我想找到所有项目及其用户和角色。所以我使用了带有“include”参数的 findAll,如下所示:

models.Projects.findAll({
    include:[
             {
                 model: models.User, 
                 as:'users',
                 through: {attributes: ['role'], as: 'role'}
             }]
}).then(function(result) {
     // ...
});

这很好用,但我只有与用户关联的 roleId。我无法将此“roleId”与角色表链接起来以获取角色名称等其他属性...

这是我得到的 JSON:

[
{
    "id": 1,
    "name": "Project name",
    "users": [
        {
            "id": 1,
            "name": "User name",
            "role": {
                "role": 1
            }
        }
    ]
}
]

但我想要这样的东西:

[
{
    "id": 1,
    "name": "Project name",
    "users": [
        {
            "id": 1,
            "name": "User name",
            "role": {
                "id": 1,
                "name": "Role name",
                "description": "Some info...",
            }
        }
    ]
}
]

我已经尝试了很多东西来实现这个关联,甚至连续包含但都没有成功。 findAll 选项中需要什么来获取此 JSON 结果?

谢谢

最佳答案

假设您的 User 模型链接到 Role 模型,这样的事情应该有效:

models.Projects.findAll({
    include:[
             {
                 model: models.User, 
                 as:'users',
                 through: {attributes: []},
                 include: [models.Role]
             }] }).then(function(result) {
     // ... });

关于mysql - 使用关联和外键对 findAll 进行后续处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37747904/

相关文章:

php - 将两个表的结果合并为 JSON 数据

java - 如何将 MySQL 表的列的值检索到代码中?

php - 在 WordPress 插件中插入 .sql 文件中的数据

mysql - 哪个更快 : multiple single INSERTs or one multiple-row INSERT?

sql-server - MSSQL 架构和 Hibernate 5.1.0.Final(未找到表)

python - Django ORM 可以对列的特定值执行 ORDER BY 吗?

orm - 如何使用EclipseLink和JPA2实现通用的“saveOrUpdate”方法

node.js - MongoError : The 'cursor' option is required, 除了带有解释参数的聚合

node.js - Nodejs Promise async/await 无法正常工作

javascript - 鲍尔 "Git not in the PATH"错误