【问题标题】:Sequelize findAll with association and foreign key使用关联和外键对 findAll 进行续集
【发布时间】:2016-10-11 09:38:38
【问题描述】:

我正在使用 sequelize 在我的节点应用程序中对 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 结果?

谢谢

【问题讨论】:

    标签: mysql node.js orm sequelize.js


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复,但我已经尝试过,但它不起作用。确实,我遇到了像“未知列 users.role”这样的错误,这是有道理的,因为角色不是用户表中的列,而是 project_user 中的列。
    • 如果您在 User 和 Role 之间没有关系,那么您唯一的选择是对连接表 (project_user) 进行建模并在那里添加与 Role 的关系。如果不定义关联,则无法检索完整的模型数据(表格的一行)...
    • 是的,这就是我所做的。您可以看到我的 Projet_User 模型,它与 Role(roleId 作为外键)有关系。但是我没有在我的 findAll() 中找到正确的语法来显示角色数据,而不仅仅是与项目关联的每个用户的外键 roleId。
    • @Raptack 如果您现在有解决方案并且可以与我们分享,那就太好了,我现在也遇到了同样的问题...谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2021-01-03
    • 2018-06-27
    • 1970-01-01
    相关资源
    最近更新 更多