Sails.js协会水线查询

Sails.js Waterline query by association

我正在使用 Sails.js 开发应用程序并使用 Waterline orm for db。我正在为用户开发功能,让他们可以互相发送好友请求和其他类似请求。为此,我有以下 URequest 模型:

    module.exports = {

    attributes: {
        owner: {
            model: 'Person'
        },

        people: {
            collection: 'Person'
        },

        answers: {
            collection: 'URequestAnswer'
        },

        action: {
            type: 'json'    //TODO: Consider alternative more schema consistent approach.
        }
    }
};

基本上 owner 是与发出请求的人的关联,而 people 是与请求所针对的所有人的一对多关联。目前还好。

现在我想要一个控制器,其中 returns 涉及特定用户的所有请求意味着用户在所有者字段中或在人中的所有请求。我如何查询 "give me all rows where there is association to person P" ?换句话说,我怎么知道哪些 URequest 模型与某个人有关联?

我试过这样的事情:

getRequests: function (req, res) {
    var personId = req.param('personId');
    URequest.find().where({
    or: [
        {people: [personId]},   //TODO: This is not correct
        {owner: personId}
        ]
}).populateAll().then(function(results) {
        res.json(results);
    });

},

所以我知道如何做 "or" 部分,但我如何检查 personId 是否在 people 中?我知道我应该能够以某种方式查看 join-table 但我不知道如何并且无法从与我的情况相关的 Waterline 文档中找到很多。另外,我试图保持这个 db-agnostic,虽然我正在使用 atm MongoDB 但以后可能会使用 Postgres。

老实说,这是一个棘手的问题,据我所知,使用 Waterline 无法实现您想要执行的操作,因此您可以选择使用 query( ) 编写本机查询,如果您是使用基于 sql 的适配器或本机适配器,或者尝试进行一些手动过滤。手动过滤取决于您处理的数据集有多大。

我的想法立即开始稍微修改您的数据模型,也许您有一个存储关联的 table 而不是集合。像这样:

module.exports = {

attributes: {
    owner: {
        model: 'URequest'
    },

    person: {
        model: 'Person'
    }
}

使用 sailsjs 模型方法(如 beforeCreate),您可以根据需要自动创建这些关联。

祝你好运,希望你能成功!