Sequelize:使用不同的条件查询相同的连接表

我有两个模型ContactThread与一个多对多的关系表示在一个连接表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]}, }); 

另外请注意,列名可能是不正确的,如何定义你的模型,我只是做了一些假设,他们将如何看。