如何在Sequelize ORM中限制连接行(多对多关联)?

7

Sequelize 定义了两个模型:Post 和 Tag,它们之间是多对多的关系。

Post.belongsToMany(db.Tag, {through: 'post_tag', foreignKey: 'post_id', timestamps: false});
Tag.belongsToMany(db.Post, {through: 'post_tag', foreignKey: 'tag_id',timestamps: false});

在“标签”页面上,我想获取相关标签数据和相关文章,并通过分页显示它们。因此,我应该限制文章数量。但是,如果我尝试在“include”内部限制它们,那么...
Tag.findOne({
    where: {url: req.params.url},
    include: [{
        model : Post,
        limit: 10
    }]
}).then(function(tag) {
    //handling results
});

我收到以下错误信息:

我收到以下错误信息:

Unhandled rejection Error: Only HasMany associations support include.separate

如果我尝试切换到“HasMany”关联,我会收到以下错误。
Error: N:M associations are not supported with hasMany. Use belongsToMany instead

另一方面,文档说明限制选项“仅支持include.separate=true”。如何解决这个问题?

3个回答

4

我知道这个问题很老了,但对于那些仍然遇到此问题的人,有一个简单的解决方法。

由于Sequelize将自定义方法添加到关联模型的实例中,您可以重构您的代码,使其类似于以下内容:

const tag = await Tag.findOne({ where: { url: req.params.url } });
const tagPosts = await tag.getPosts({ limit: 10 });

这将与您的代码完全相同,但可以进行限制和偏移。

2

我这里也有同样的问题。据我所知,要使用limit/offset,需要使用include.separate,但belongToMany关联还不支持这个功能,因此你现在的尝试暂不支持。

已经有人在处理这个问题了,你可以在这里跟踪。


0

我知道这是一个很久没有得到答案的问题。

对于仍然遇到此类问题的人,

正如之前的回答提到的,belongsToMany关联不支持限制或偏移..

在处理多对多关系时,将限制和偏移移动到包含数组之外,即使您已经查询为findOne(),在外部级别传递限制或偏移量也仅在您的includes数组中具有的内部关系中激活,仅在Many-Many Relations中。

它将自动处理内部结果的限制和偏移

Tag.findOne({
    where: {url: req.params.url},
    include: [{
        model : Post,
        limit: 10 ❌ ( only exists in hasMany() )
    }]
    limit:10, ✅ ( This will solve your issue )

}).then(function(tag) {
    //handling results
});

希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接