我有2个模型,User和Friend。在朋友中,我有2列(UserId1,UserId2)
我想在指定了UserId1的朋友行中查找,然后从具有这些行的表中查找ID为UserId2的用户的表
index: function(req, res, next) {
Friend.find({UserId1 : req.session.User.id}, function foundUsers(err, friends) {
if (err) return next(err);
// pass the array down to the /views/index.ejs page
res.view({
friends: friends
});
});
}
上面的代码返回指定了UserId1的带有Friends(UserId1,UserId2)的表,但是如何返回ID为UserId2的Users(来自模型User)的表?
最佳答案
因此,听起来您正在使用Friend
模型作为表示两个用户之间友谊的联接表。您当前在代码中的查询从联接表中获取所有记录,其中UserId1
是已登录用户的ID,对于每个记录,您都希望为该用户获取完整的User
对象其ID与UserId2
列匹配。如果是这种情况,则完整的代码可能类似于:
index: function(req, res) {
Friend.find({UserId1 : req.session.User.id})
.exec(function foundUsers(err, friend_records) {
if (err) return res.serverError(err);
// Get an array of all the UserId2 values, using sails.util.pluck,
// which is essentially Lodash's _.pluck
var friend_ids = sails.util.pluck(friend_records, 'id');
// Get the User records for those users. Using an array
// in the criteria makes Waterline do an "in" query
User.find({id: friend_ids}).exec(function(err, friends) {
// pass the array down to the /views/index.ejs page
res.view({
friends: friends
});
});
});
}
一些注意事项:
几乎不要在控制器代码中使用
next
,尤其是对于错误处理。如果有错误,请使用响应进行处理。将next
保存为policies,除非您确实确实打算让另一个控制器为您处理响应。Sails v0.10(当前为Beta)包含support for associations,它将为您处理联接表。