【问题标题】:Sequelize findall for every findall is possible?为每个 findall 续集 findall 是可能的吗?
【发布时间】:2014-06-26 21:28:39
【问题描述】:

我有这张桌子。客户有项目,用户在项目中工作

Clients
- id
- name

Projects
- id
- name
- client_id

Users
- id
- name

UserProject
- user_id
- project_id

我尝试返回客户端每个项目的所有用户,例如 id=1 最后的结果,像这样的 JSON:

[{
   id:1
   name:"Project1"
   users:[{
            id:23
            name:"Robert Stark"
          },{
            id:67
            name: "John Snow"
          }]
 }, {
   id:2
   name:"Project2"
   users:[{
            id:1
            name:"Aria Stark"
          }]
}]

如果我找到项目,它工作正常

req.tables.Project.findAll({
    where: {
        client_id:1
    }
 }).success(function(projects) {
          ...

如果我找到一个项目的用户,它就可以正常工作

req.tables.UserProject.findAll({
   where: {
       project_id:1
   },
   include: [
       { model: req.tables.User, as: 'User' }
   ]
}).success(function(UsersProject) {
     ...

但是,如何结合这两个 finAll 来返回每个项目中的所有用户?类似于下一个代码,但效果很好。我该怎么做? 我发现了这个:Node.js multiple Sequelize raw sql query sub queries 但它对我不起作用或者我不知道如何使用它,因为我有 2 个循环,而不仅仅是一个。我有项目循环和用户循环

req.tables.Project.findAll({
    where: {
        client_id:1
    }
}).success(function(projects) {

    var ret_projects=[];

    projects.forEach(function (project) {

         var ret_project={
             id:project.id,
             name:project.name,
             data:project.created,
             users:[]
         });

         req.tables.UserProject.findAll({
             where: {
                 project_id:project.id
             },
             include: [
                 { model: req.tables.User, as: 'User' }
             ]
         }).success(function(UsersProject) {

             var ret_users=[];

             UsersProject.forEach(function (UserProject) {
                 ret_users.push({
                     id:UserProject.user.id,
                     name:UserProject.user.name,
                     email:UserProject.user.email
                  });
             });
             ret_project.users=ret_users;
             ret_project.push(ret_project)
         });
     });

     res.json(projects);
});

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    听起来您已经有了解决方案,但我遇到了同样的问题并想出了这个解决方案。

    cvng 所说的非常相似,只是使用了嵌套包含。所以使用:

    Project.belongsTo(Client);
    Project.hasMany(User);
    User.hasMany(Project);
    

    然后:

    req.tables.Client.find({
        where: { id:req.params.id },
        include: [{model: req.tables.Project, include : [req.tables.User]}]
      }).success(function(clientProjectUsers) {
        // Do something with clientProjectUsers.
        // Which has the client, its projects, and its users.
      });
    }
    

    通过参数“option.include[].include”描述了“加载进一步嵌套的相关模型”的能力:Sequelize API Reference Model

    也许这在将来对其他人有用。

    干杯!

    【讨论】:

    【解决方案2】:

    我认为您不必直接查询 UserProject 实体,而是使用 Sequelize Eager 加载方法来检索您的实体。

    您的模型关联应如下所示:

    Project.belongsTo(Client);
    Project.hasMany(User, { as: 'Workers' });
    User.hasMany(Project);
    

    一旦你有了与客户相关的所有项目,你的 finder 方法:

    Project
         .findAll({ include: [{ model: User, as: 'Workers' })
         .success(function(users) {
             // do success things here
         }
    

    看看,http://sequelizejs.com/docs/1.7.8/models#eager-loading

    希望对你有帮助!

    【讨论】:

    • 为了防弹,请将through: 'UserProject 添加到Project.hasMany(User)User.hasMany(Project)
    • 我做了一个要点你想看看! many-to-many
    【解决方案3】:

    终于!!

    cvng,你的例子对我很有帮助,谢谢。 但是我有3个级别的Client,Project,这是我的最终解决方案,这是一个好的解决方案吗?

      req.tables.Client.find({
                where: { id:req.params.id },
                include: [{ model: req.tables.Project, as: 'Projects' }]
            }).success(function(client) {
    
                var ret ={
                        id:client.id,
                        name:client.name,
                        projects:[]
                    };
    
                done = _.after(client.projects.length, function () {
                    res.json(ret);
                });
    
                client.projects.forEach(function (project) {
                    project.getUsers().success(function(users) {
    
                        var u=[]
                        users.forEach(function (user) {
                            u.push({
                                id:user.id,
                                name:user.name,
                            });
                        });
    
                        ret.projects.push({
                            id:project.id,
                            name:project.name,
                            users:u
                        });
                        done();
    
                    });
    
                });
    
            });
    

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 2016-07-15
      相关资源
      最近更新 更多