gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:16:28 25 4
gpt4 key购买 nike

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

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

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

我可以像这样成功查询 Note 模型,获取属于 ID 为 2 的 Topic 的所有 Notes:

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

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

我已经尝试在我的位置添加这个运算符:

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

但是出现错误:

operator does not exist: 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 对时,此方法才可靠地工作- IE。这些字段上有某种 unique 键。否则,一个主题可以多次分配给一个注释,这将抛出 COUNT(*)。我相信 Sequelize 创建的默认“through”表在两个字段上都有一个 unique 键;然而,在某些合理的情况下可能不希望这样做,所以我认为值得一提。

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

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

关于javascript - 查询 Sequelize 模型以匹配多个关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51819836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com