Sails.js通过外键查询db

时间:2015-07-01 19:48:59

标签: javascript sails.js waterline

我想知道如何使用默认的Waterline模型通过外键进行查询。

我有两个模型Post和Category - Post有一个外键类别。我需要像这样进行查询:

Post.find({
  where: {
    category: query
  }
}).exec(function (err, data) {});

在这种情况下,query是一个字符串,因此返回的结果应该是包含搜索类别的帖子。

这样做的最佳方式是什么?

注意:当前示例不起作用

2 个答案:

答案 0 :(得分:3)

你的模特应该是

// Post
module.exports = {
  attributes: {
    name: {
       type: 'string'
    },
    category: {
       model: 'category'
    }
  }
};

// Category
module.exports = {
  attributes: {
    name: {
       type: 'string'
    },
    post: {
       collection: 'Post',
       via: 'category'
    }
  }
};

然后从类别查询

Category
    .find()
    .where({ name: query })
    .populateAll()
    .exec(function (error, categories) {
       var catArr = [];

       if (categories.length) {
         categories.map(function (item) {
           catArr.push(item.id);
         });
       }

       Post.find().where({ category: catArr }).exec(function (error, posts) {
         // do stuff
       });

    });

或者只是您可以通过

post查询
Post
    .find()
    .where({ category: categoryId })
    .populateAll()
    .exec(function (error, posts) {
       // posts is all post with category that defined
    });

如果您想从categoryId查询,请确保知道post。我通常使用categoryIdstring并从name进行slugify,因此我可以按名称查询类别,并确保类别名称(当然还有ID)是唯一的。

答案 1 :(得分:1)

计算如何使用类别ID实现此目的:

Category.find().where({ name: query }).exec(function (error, categories) {
   var catArr = [];

   if (categories.length) {
     categories.map(function (item) {
       catArr.push(item.id);
     });
   }

   Post.find().where({ category: catArr }).exec(function (error, posts) {
     // do stuff
   });

});

还必须在模型中添加属性,如下所示:

// Post
module.exports = {
  attributes: {
    name: {
       type: 'string'
    },
    category: {
       model: 'category'
    }
  }
};

// Category
module.exports = {
  attributes: {
    name: {
       type: 'string'
    },
    post: {
       model: 'post'
    }
  }
};