查询 Sequelize 模型以匹配多个关联



所以我有两个具有这种关系的Sequelize模型:

models.Note.belongsToMany(models.Topic, {
through: 'noteTopicRelation'
});
models.Topic.belongsToMany(models.Note, {
through: 'noteTopicRelation'
});

我可以像这样对 Note 模型进行成功的查询,获取属于 id 为 2 的主题的所有注释:

models.Note.findAll({
include: [{
model: models.Topic,
through: 'noteTopicRelation',
}]
where: {
'$topics.id$': 2
}
})

但是,如果我只想要一个具有多个特定主题的注释(即与 ids 1、4、6 的主题关联的注释(怎么办?

我尝试在我的位置添加此运算符:

where: {
'$topics.id$': {$overlap: [1, 4, 6]}
}

但是收到错误:

运算符不存在:uuid && text[]

我是否使用Op.overlap不正确?有没有其他方法可以实现这个结果?谢谢!

编辑:只是为了澄清(抱歉,如果我的原始帖子中不清楚(,我想获得与所有这些主题严格相关的注释。执行'$topics.id$': [1, 4, 6]将获得与任何这些主题相关的笔记。

我认为你想要$in而不是$overlap;后者映射到PostgreSQL&&运算符,该运算符用于范围类型,而不是列表。

所以我建议尝试:

where: {
'$topics.id$': [1, 4, 6]
}

以上将获得具有任何主题ID的注释(在问题被编辑之前发布,以表示仅应返回具有所有提供topic.id的注释(。

根据下面评论中Sequelize github问题页面上的讨论链接;获取所有主题ID的笔记的一种方法,您需要执行以下操作:

var topicIds = [1, 4, 6];
models.NoteTopicRelation
.findAll({
include: [
{model: models.Topic, where: {id: topicIds}}
],
group: ['note_id'],
having: ['COUNT(*) >= ?', topicIds.length]
})
.then((noteTopicItems) => models.Note.find({
where: {id: noteTopicItems.map((item) => item.note_id)}
}))
.then((notes) => {
// do something with notes
});

请注意,此方法仅在链接表(即在您的情况下noteTopicRelation(只有唯一的note_idtopic_id对时才可靠工作 - 即在这些字段上有某种unique键。否则,可以将一个主题多次分配给一个笔记,这将引发COUNT(*)。我相信 Sequelize 创建的默认"通过"表在这两个字段上都有一个unique键;但是,在某些情况下,这可能不希望这样做,因此我认为值得一提。

另请注意,我在上面的查询中对noteTopicRelation模型的列/属性名称做了一些假设,因此您可能需要对其进行调整。

另一件需要注意的事情 - 在示例情况下,从 NoteTopicRelation 到 Topic 的连接并不是真正必要的;如果您只想按topic.id过滤,您可以使用where: {topic_id: topicIds}更有效地实现相同的目标(这将避免连接到Topic(。我已将连接留在那里,以防您实际上想要查询例如主题名称或在where子句中包含Topic模型/表中的其他属性(例如enabled属性或类似属性(。

相关内容

  • 没有找到相关文章

最新更新