我想知道如何使用默认的Waterline模型通过外键进行查询。
我有两个模型Post和Category - Post有一个外键类别。我需要像这样进行查询:
Post.find({
where: {
category: query
}
}).exec(function (err, data) {});
在这种情况下,query
是一个字符串,因此返回的结果应该是包含搜索类别的帖子。
这样做的最佳方式是什么?
注意:当前示例不起作用
答案 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
。我通常使用categoryId
为string
并从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'
}
}
};