[英]Sequelize: Query same join table with different conditions
我有两个模型Contact
和Thread
,在连接表ThreadContacts
表示多对多的关系。
我需要编写一个查询来查找一个与一个确切的联系人列表有关联的Thread 。 例如,我可能有一个contact_id
的列表[1,2,3,4],我需要找到一个与这4个联系人关联的Thread
。
我试过在findAll查询中包含Contact
:
Thread.findOne({
include: [{
model: Contact,
where: { id: $in: [1, 2, 3, 4] },
}],
})
当然这不起作用,因为它将返回一个ThreadContact与4个ID中的任何一个的线程。
我需要这样的东西:
Thread.findAll({
include: contactIds.map(id => ({
model: Contact,
where: { id },
}),
})
但是,这也不起作用,因为它包含相同模型的重复项。
我有什么选择? 我很难找到解决方案。
在sequelize中编写更复杂的连接查询时,我通常最终使用原始查询界面 。 它看起来有点复杂,但希望它有意义:
Thread.id
分组 array_agg
聚合组。 所以我们现在有一个每个线程的所有相关联系人的数组。 @>
表示)输入过滤器的位置。 参见postgres数组函数 。 结果将是与至少这4个联系人相关联的所有线程。
sequelize.query(`
SELECT Thread.*
FROM Thread
INNER JOIN ThreadContact
ON Thread.id = ThreadContact.threadId
GROUP BY Thread.id
HAVING array_agg(ThreadContact.contactId) @> ARRAY[:contactIds];
`, {
model: Thread,
mapToModel: true,
type: sequelize.QueryTypes.SELECT,
replacements: {contactIds: [1, 2, 3, 4]},
});
另请注意,列名称可能与您的模型定义方式不一致,我只是对它们的外观做了一些假设。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.