Sequelize属于在一个查询中同时得到多个关系

Sequelize belongs to many get both relations in one query

本文关键字:关系 一个 属于 Sequelize 查询      更新时间:2023-09-26

我已经属于多个模型User和Project的协会。在给定用户id的情况下,最简单的查询方法是什么?查询得到该用户拥有的所有项目,以及每个项目的所有用户。我目前的方法相当复杂,涉及两个单独的查询,然后用Javascript进行解析。我想我遗漏了一些可以简化整个过程的重要步骤。下面是我希望返回给最终用户的REST API响应。

{
    "user_id": "wru09asf",
    "projects": [
        {
            "id": "project_id",
            "content": "Final Year Project",
            "users": [
                {
                    "id": "user_id",
                    "role": "Creator"
                }
            ]
        }
    ]
}

当前我正在做

// first function, get all projects
User.findById(user_id).then(function(user) {
    user.getProjects({
    });
});

// second function, get all users of each project returned
for each project returned, do
   Project.findById(project_id).then(function(project) {
       project.getUsers();
   });
// third function
Combine the two responses using Javascript to get the final API response. 

Sequelize模型:

//User (all models are underscored named)
sequelize.define('users', {
        id: {
            type: DataTypes.STRING,
            primaryKey: true
        },
        password: DataTypes.STRING,
        salt: DataTypes.STRING,
        email: {
            type: DataTypes.STRING,
            unique: true
        }
    });
// Project
sequelize.define('projects', {
        id: {
            type: DataTypes.STRING,
            primaryKey: true
        },
        content: DataTypes.TEXT
    });
// UserProject
sequelize.define('user_project', {
        role: DataTypes.STRING
    });

关系:

User.belongsToMany(Project, {through: UserProject});
Project.belongsToMany(User, {through: UserProject});

user.getProjects()

User.findById(1).then(function(user){
    user.getProjects().then(function(projects){
        console.log(projects);
    },function(err){
        console.log(err);
    })
},function(err){
    console.log(err);
});

执行join操作:

User.findAll({
  where: {
    id: user_id
  },
  include: [Project]
}).then(function(user) {
});