Sequelize:使用不同的条件查询相同的连接表
我有两个模型Contact
和Thread
与一个多对多的关系表示在一个连接表ThreadContacts
。
我需要编写一个查询来查找与联系人的确切列表关联的线程 。 例如,我可能有一个contact_id
的列表[1,2,3,4],我需要find一个与这4个联系人相关联的Thread
。
我已经尝试包括Contact
查找所有查询:
Thread.findOne({ include: [{ model: Contact, where: { id: $in: [1, 2, 3, 4] }, }], })
当然这不起作用,因为它会返回一个线程与任何4个ID都有一个ThreadContact。
我需要这样的东西:
Thread.findAll({ include: contactIds.map(id => ({ model: Contact, where: { id }, }), })
但是,这也不起作用,因为它包括同一模型的重复。
我在这里有什么select? 我很难find解决scheme。
在后续编写更复杂的连接查询时,通常最终会使用原始查询接口 。 这看起来有些复杂,但希望这是有道理的:
- select线程并joinThreadContact表
- 按
Thread.id
分组 - 在联系人ID上使用
array_agg
组。 所以我们现在有一个每个线程的所有关联联系人的数组。 - 然后过滤到聚合数组“包含”(如
@>
)的inputfilter。 请参阅postgres数组函数 。
结果将是至less与这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]}, });
另外请注意,列名可能是不正确的,如何定义你的模型,我只是做了一些假设,他们将如何看。