我有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,它将为您处理联接表。

09-12 02:31