2016-06-10 75 views
1

我使用sequelize在我的节点应用程序中为mySql数据库模式建模。比方说,我有3个表:项目,用户和角色。使用关联和外键组合findAll

这是项目与用户之间通过“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型号

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与“包含”这样设置:

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

这个伟大的工程,但我只有与用户关联的角色ID。我没有能够与角色表,以获得其他属性,如角色名链接这种“角色ID” ......

这里是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结果?

感谢

回答

0

假设你User模型链接到Role模型,这样的事情应该工作:

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

感谢您的答复,但我已经尝试,并没有工作。事实上,我有一个像“未知列users.role”这样的错误是有道理的,因为角色不是来自用户表的列,而是来自project_user。 – Raptack

+0

如果您没有用户和角色之间的关系,那么您唯一的选择是对连接表(project_user)建模并将关系添加到角色。如果不定义关联,则无法检索完整模型数据(表格的一行)... – Aralizer

+1

是的,这就是我所做的。您可以看到我的Projet_User模型,与角色(roleId作为外键)的关系。但是我在我的** findAll()**中找不到正确的语法来显示角色数据,而不仅仅是与项目关联的每个用户的外键roleId。 – Raptack