所以我有两个具有这种关系的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_id
和topic_id
对时才可靠工作 - 即在这些字段上有某种unique
键。否则,可以将一个主题多次分配给一个笔记,这将引发COUNT(*)
。我相信 Sequelize 创建的默认"通过"表在这两个字段上都有一个unique
键;但是,在某些情况下,这可能不希望这样做,因此我认为值得一提。
另请注意,我在上面的查询中对noteTopicRelation
模型的列/属性名称做了一些假设,因此您可能需要对其进行调整。
另一件需要注意的事情 - 在示例情况下,从 NoteTopicRelation 到 Topic 的连接并不是真正必要的;如果您只想按topic.id
过滤,您可以使用where: {topic_id: topicIds}
更有效地实现相同的目标(这将避免连接到Topic
(。我已将连接留在那里,以防您实际上想要查询例如主题名称或在where
子句中包含Topic
模型/表中的其他属性(例如enabled
属性或类似属性(。