使用关联和外键续订findAll

时间:2016-06-10 12:07:12

标签: mysql node.js orm sequelize.js

我正在使用sequelize在我的node-application中建模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'});
        }
    }
});

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

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结果?

由于

1 个答案:

答案 0 :(得分:0)

假设您的User模型与Role模型相关联,则此类内容应该有效:

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