【问题标题】:Sequelize join and limitSequelize 加入和限制
【发布时间】:2015-06-11 08:56:45
【问题描述】:

我正在尝试使用 Sequelize 形成一个查询以加入和选择 + 限制。让我来说明问题:

我有一个多对多关系:Book - Reader。一个读者可以有很多书,而一本书可以有很多读者。

鉴于Book 的ID,我想翻阅它的所有Readers。 这是我目前尝试过的,它有一些问题。首先分页不起作用。其次它仍然选择BookReader的所有属性,而我只需要Reader(我正在扔掉所有Book)。

/**
 * Get all Readers of a Book.
 *
 * @param {Number} bookId id of the book
 * @param {Number} limit number of readers to retrieve
 * @param {Number} offset number of readers to skip 
 * @return {Promise} contains an array of readers
 */
function getBookReaders(bookId, limit, offset) {
  return Book.findOne({
    id: bookId,
    include: [Reader],
    limit: 10,
    offset: 30
  }).then(function(book) {
    return book.readers;
  });
}

关于如何正确形成这个查询有什么建议吗?

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    我不确定这是否真的有效,但将限制应用于您想要限制的模型是有意义的:

    Book.findOne({
      id: bookId,
      include: [ { model: Reader, limit: 10, offset: 30 } ]
    }).then(function(book) {
      return book.readers;
    });
    

    【讨论】:

    • 限制/偏移仍然不起作用,API docs 没有列出嵌套包含模型的限制/偏移选项
    • 是的。似乎有一个功能请求,但现在似乎没有任何方法可以在不查询两次的情况下做到这一点。但是由于您知道引用,因此您可以使两个查询与 Promise.all() 并行运行。
    • 对不起,没有遵循,我将如何并行执行此操作?这是一个多对多模型,所以我需要连接表来获取所有Reader 的id / 我无法直接查询Reader 表。
    • 嗯...多对多可能会造成问题,但您可以反转查询并仍然获得书籍和读者:Reader.findAll({ include [ { model: Book , 其中: { id: bookId }, required: true } ], limit: 10, offset: 30 });
    • 那里仍然有一些问题,最终使用原始查询也只选择了我需要的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多