在Sails.js(使用Waterline ORM)中,如何仅在条件适合关联时查询返回记录的模型。以下是代码:
Order.find()
.populate('books', {title: {startsWith: 'Star Trek'}})
.exec(function (err, foundOrders) {
....
});
模型如下:
订单:
module.exports = {
attributes: {
...
books: {
collection: book,
via: order
through: orderbook
}
}
图书:
module.exports = {
attributes: {
....
order: {
collection: order,
via: book
through: orderbook
}
}
手持订单:
module.exports = {
attributes: {
order: {
model: order
},
book: {
model: book
}
}
}
我发现结果记录集是所有订单。只有每个订单的填充结果仅包含标题以“星际迷航”开头的书籍。
这不是我想要的。我想要退回只有标题以“星际迷航”开头的书籍的订单。
请有人建议如何正确查询我的查询声明吗?
答案 0 :(得分:1)
几天后谷歌搜索这个问题,我仍然找不到一个好的解决方案。但我以一种不那么完美的方式解决了这个问题,但至少它起作用了。
Book.find({title: {startsWith: 'Star Tek'}}).populate('orders')
.exec(function (err, foundBooks) {
if (err) return res.negotiate(err);
var orderIds = [];
for (var i=0; i<foundBooks.length; i++) {
for (var j=0; j<foundBooks[i].orders.length; j++) {
orderIds.push(foundBooks[i].orders[j].id;
}
}
Order.find({id: orderIds}).populate('books').populate( .. some other associations .. )
.exec(function (err, foundOrders) {
...
});
});
希望有人能提出更优雅的方式。
答案 1 :(得分:0)
当您检查:http://sailsjs.com/documentation/reference/waterline-orm/queries/populate时,您会发现:
Something.find() .populate(association,subcriteria) .exec(函数事后(错误,populatedRecords){ });
所以你可以使用它,例如就像在文档中一样:
User.find({
name:'Finn'
}).populate('currentSwords', {
where: {
color: 'purple'
},
limit: 3,
sort: 'hipness DESC'
}).exec(function (err, usersNamedFinn){
很好,很容易。祝你好运!