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结果?
感谢
感谢您的答复,但我已经尝试,并没有工作。事实上,我有一个像“未知列users.role”这样的错误是有道理的,因为角色不是来自用户表的列,而是来自project_user。 – Raptack
如果您没有用户和角色之间的关系,那么您唯一的选择是对连接表(project_user)建模并将关系添加到角色。如果不定义关联,则无法检索完整模型数据(表格的一行)... – Aralizer
是的,这就是我所做的。您可以看到我的Projet_User模型,与角色(roleId作为外键)的关系。但是我在我的** findAll()**中找不到正确的语法来显示角色数据,而不仅仅是与项目关联的每个用户的外键roleId。 – Raptack