在 Sequelize 中限制延迟加载的关联

Posted

技术标签:

【中文标题】在 Sequelize 中限制延迟加载的关联【英文标题】:Limiting lazy loaded associations in Sequelize 【发布时间】:2020-02-22 18:00:29 【问题描述】:

我使用Sequelize 5 作为我的 GraphQL API 的 ORM,但在查询关联数据时遇到了性能问题。

假设我有一个User,它有很多Posts,所以我的模型定义如下所示:

class User extends Model  
User.init( name: Sequelize.STRING ,  sequelize );

class Post extends Model  
Post.init( content: Sequelize.STRING ,  sequelize );

User.hasMany(Post);

现在我从数据库中获取了一个User 模型,我想查询来自该用户的x 数量的帖子。我知道我可以使用 user.getPosts() 获取所有帖子,但这会返回比我需要的更多的记录。

我找到了this answer,它解释了当急切加载使用include选项的关系时如何应用限制,但就我而言,我想延迟加载 em>关系。原因在于 GraphQL 解析器的工作方式。

所以我的问题是:如何获得用户的第一个 x 帖子?

【问题讨论】:

【参考方案1】:

您可以将额外的find 选项传递给getter。尽管简要提到了here,但这并没有得到很好的记录。所以你可以这样做:

user.getPosts(
  limit: 10,
  offset: 100,
  where:  /* whatever */ ,
  order: [ /* whatever */ ],
  transaction,
  etc.
)

【讨论】:

我已经阅读了很多文档,但仍然找不到。他们绝对可以在这方面做得更好。非常感谢丹尼尔的帮助!【参考方案2】:

我希望有一个更流畅的界面,但我目前简单地解决了这个问题:

return db.models.posts.findAll(
    where:  userId: user.id ,
    limit: x,
);

【讨论】:

以上是关于在 Sequelize 中限制延迟加载的关联的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis延迟加载和缓存

MyBatis专题-延迟加载

延迟加载

MyBatis一对多查询及延迟加载

为啥延迟加载在一对一关联中不起作用?

11.延迟加载