gpt4 book ai didi

javascript - 在 Sequelize 中查找与来自其他模型的多个(所有)实例关联的实例

转载 作者:行者123 更新时间:2023-12-03 22:40:24 24 4
gpt4 key购买 nike

简化的 Sequelize 模型示例:

Post.belongsToMany(Tag)
Tag.belongsToMany(Post)

我如何 findAll 与一组标签的所有相关联的帖子?

示例数据集:
post
{ id: 1 }
{ id: 2 }

tag
{ id: 10 }
{ id: 11 }

post_tag
{ post_id: 1, tag_id: 10 }
{ post_id: 2, tag_id: 10 }
{ post_id: 2, tag_id: 11 }

所以如果有问题的标签是 10 11 ,查询应该返回 Post 2 因为它与两个标签相关联,但不是 Post 1 因为它没有与所有标签相关联。 (标签的数量当然可以超过两个)

最佳答案

可能有一种方法可以在一个 Sequelize findAll 请求中构造此请求,但我不得不使用原始 SQL 来完成您的任务。这里有两种方法:

1. 获取帖子ID并用结果查询Post.findAll
查找包含所有标签的 post_ids

const postIds = await db.query(`
SELECT post_id FROM (
SELECT post_id, COUNT(*) AS counter
FROM post_tag
GROUP BY post_id
) AS tbl
WHERE counter = (SELECT count(*) as COUNT from tags);;
`, {type: db.QueryTypes.SELECT})

查找存在于 postIds 数组中的帖子
const posts = await Post.findAll({
where: {
id: {
$in: postIds.map(x => x.post_id)
}
}
});

2. 一条SQL语句获取帖子
const posts = await db.query(`
SELECT *
FROM posts
WHERE id IN (
SELECT post_id FROM (
SELECT post_id, COUNT(*) AS counter
FROM post_tag
GROUP BY post_id
) AS tbl
WHERE counter = (SELECT count(*) as COUNT from tags)
)
`, {type: db.QueryTypes.SELECT});

(fwiw,我添加了这两种方法,因为我更喜欢应用程序代码中较少的原始 SQL)

关于javascript - 在 Sequelize 中查找与来自其他模型的多个(所有)实例关联的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48685363/

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