如何正确构建此Sequelize查询?

时间:2016-12-24 22:35:21

标签: node.js database postgresql sequelize.js

我要做的是通过用户名找到用户,还包括他们是否是当前用户的朋友。

我想尝试使用一个查询执行此操作,以便减轻服务器上的负载。我倾向于相信在用户通过用户名获取用户后我将不得不再进行一次查询,以确定他们是否是朋友。

exports.findUser = (req, res) => {

    //Get the username of the person to find
    var username = req.params.username.toLowerCase();

    if (!username) {
        //No username given
        res.status(400).send();
    } else if (username == req.user.get('username')) {
        //Send back a 400 because we dont want users thinking there is someone with their username
        res.status(400).send()
    }

    //Get a user where the username matches the one given
    db.user.findOne({
        where: {
            username: username
        },
        attributes: [
            "id",
            "username"
        ],
        include: [{
            model: db.friend,
            where: {
                //Or is used because we don't know who created the friendship
                $or: [
                    {
                        friendOneId: NEED THE ID OF THE USER IM SEARCHING,
                        friendTwoId: req.user.get('id')
                    }, 
                    {
                        friendOneId: req.user.get('id'),
                        friendTwoId: NEED THE ID OF THE USER IM SEARCHING
                    }
                ]
             }
        }]
    }).then(function(user) {
        if (user) {
            res.json(user);
        } else {
            res.status(404).send();
        }
    }, function(e) {
        res.status(500).send();
    });
};

这是我要求的朋友模型

module.exports = function(sequelize, DataTypes){
    return sequelize.define('friend', {
        friendOneId: {
            type: DataTypes.INTEGER,
            allowNull: false
        },
        friendTwoId: {
            type: DataTypes.INTEGER,
            allowNull: false
        }
    });
};

1 个答案:

答案 0 :(得分:0)

从我所看到的你只需要从查询的不同OR部分中删除AND,基本上就是这样:

where : {
     $or: [
         {
             friendTwoId: req.user.get('id')
         },          
         {       
             friendOneId: req.user.get('id'),
         }
     ]
},
required: false

此外,如果您将required属性设置为false,则查询也将返回所有其他用户,即使包含查询未显示任何结果