Node.js多个Sequelize原始sql查询子查询

时间:2013-09-05 15:41:27

标签: javascript node.js sequelize.js

标题听起来很复杂。我有一个用户表,每个用户可以有多个兴趣。这些兴趣通过查找表链接到用户。在PHP中,我查询了users表,然后为每个人做了查询以查找兴趣。我如何在Node.js / Sequelize中执行此操作?我怎样才能设定某种承诺呢?例如:

sequelize.query("SELECT * FROM users").success(function(users) {
    for (var u in users) {
       sequelize.query("SELECT interests.id, interests.title FROM interests, user_interests WHERE interests.id = user_interests.interest_id AND user_interests.user_id = " + users[u].id).success(function(interests) {
       if (interests.length > 0) {
         users[u].interests = interests;
       }
    });
 }
return users;

});

1 个答案:

答案 0 :(得分:13)

从代码底部的return语句来看,似乎你还没有完全掌握node.js的异步性质。代码中的return语句将在第一次调用sequelize.query之后,即在查询返回之前直接执行。这意味着用户将是未定义的。

如果你想真正“回报”用户及其兴趣,我会建议这样的事情:

sequelize.query("SELECT * FROM users").success(function(users) {
    done = _.after(users.length, function () {
        callback(users)
    })

    for (var u in users) {
        sequelize.query("SELECT interests.id, interests.title FROM interests, user_interests WHERE interests.id = user_interests.interest_id AND user_interests.user_id = " + users[u].id).success(function(interests) {
            if (interests.length > 0) {
             users[u].interests = interests;
            }
            done();
        });
    }
});

在上面的代码中,_指的是实用程序库。在函数调用users.length次之后执行回调函数。回调是一个传递给您的代码段的函数,应该处理返回结果,例如在Web服务器的上下文中将用户返回到客户端。

另一条评论 - 如果您只是在进行原始SQL查询,Sequelize可能不是您的最佳选择。您没有直接使用SQL驱动程序的任何原因?如果你想使用sequelize,你应该利用它的功能。尝试使用JOINs / eager loading

为用户和兴趣定义模型,设置关联并一次性加载用户和兴趣

更新:使用承诺的示例

sequelize.query("SELECT * FROM users").then(function(users) {
  return sequelize.Promise.map(users, function (u) {
    return sequelize.query("SELECT interests.id, interests.title FROM interests, user_interests WHERE interests.id = user_interests.interest_id AND user_interests.user_id = " + users[u].id).then(function(interests) {
      if (interests.length > 0) {
        user.interests = interests;
      }
    });
  });
});