在续篇中,如何查询与“通过”关联的模型

时间:2018-12-22 01:14:53

标签: associations sequelize.js

我对Sequelize还是很陌生,需要帮助来创建在两个表之间进行查询的方法。 我给出了三个模型,分别是“ user ”,“ project ”和“ user_project ”。

user_project 存储用户和项目之间的关系。它使用其他表中的两个外键(user_id和project_id)。 另外, user_project 有一个名为“ role”的字段,用于指定用户在项目中的角色。我试图找出一种基于用户“电子邮件”提取用户角色的方法。请注意,用户电子邮件存储在用户表中。

它们之间的关联如下:

  models.project.belongsToMany(models.user, {
    through: models.user_project,
    foreignKey: {
      name: 'projectId',
      field: 'project_id'
    }
  });

  models.user.belongsToMany(models.project, {
    through: models.user_project,
    foreignKey: {
      name: 'userId',
      field: 'user_id'
    }
  });

谢谢。

1 个答案:

答案 0 :(得分:0)

知道这已经很晚了,但希望以后还会有人-

使用原始查询,然后将角色字符串转换为数组-

User.findOne({
    where: {email},
    attributes: [
        'id', 'email',
        [Sequelize.literal("(SELECT GROUP_CONCAT(roles) FROM user_project UP WHERE UP.user_id=user.id )"), "roles"],
    ]
}).then( (user) => {

    if(!user)
        return null;

    user = JSON.parse(JSON.stringify(user));

    if(!user.roles)
        user.roles = [];
    else
        user.roles = user.roles.split(",");

    return user;

});

无需使用Raw即可获得角色-

User.findOne({
        where: {email},
        attributes: [
            'id', 'email'
        ],
        include: [
            {
                model: Db.user_project,
                required: false,
                attributes: ["user_id", "roles"]
            }

    ]
}).then( (user) => {

    if(!user)
        return null;

    user = JSON.parse(JSON.stringify(user));

    if(!user.roles)
        user.roles = [];
    else
        user.roles = user.roles.map(r => r.roles);

    return user;

});