在Sails.js中,如何在关联时查询具有条件的模型

时间:2016-12-10 15:10:17

标签: sails.js

在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
    }
  }
}

我发现结果记录集是所有订单。只有每个订单的填充结果仅包含标题以“星际迷航”开头的书籍。

这不是我想要的。我想要退回只有标题以“星际迷航”开头的书籍的订单。

请有人建议如何正确查询我的查询声明吗?

2 个答案:

答案 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){

很好,很容易。祝你好运!