首页 文章

使用关联和外键来查找findAll

提问于
浏览
1

我正在使用sequelize在我的node-application中建模mySql数据库模式 . 假设我有3个表:项目,用户和角色 .

通过“Project_User”,Project和User之间的“多对多”关联定义了用户对项目的角色 .

Project Model :

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...
);

User Model :

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

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

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

相关问题