2013-09-05 119 views
3

標題聽起來很複雜。我有一個用戶表,每個用戶可以有多個興趣。這些興趣通過查找錶鏈接到用戶。在PHP中,我查詢用戶表,然後爲每個人做了一個查詢來尋找興趣。我怎麼能在Node.js/Sequelize中做到這一點?我怎樣才能設立某種承諾呢?例如:Node.js多個Sequelize原始sql查詢子查詢

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; 

});

回答

7

從代碼底部的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; 
     } 
    }); 
    }); 
}); 
+0

例如只要記住,你必須包括[下劃線](https://npmjs.org/package/underscore)模塊 – josemando

+2

_已被用於續集,並通過'Sequelize.Utils._'公開 –

+0

嗨Jan 我在同一個問題上被阻止了很多個小時。我嘗試使用Promise.all沒有任何運氣。我是新來的node.js和所有異步的東西,所以我很困惑,但我想知道你是否有一個使用Promise.all的工作示例?謝謝 在任何情況下,你的答案工作,並幫助我很多。 – Etienne