簡體   English   中英

Sequelize:查詢具有不同條件的相同連接表

[英]Sequelize: Query same join table with different conditions

我有兩個模型ContactThread ,在連接表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中編寫更復雜的連接查詢時,我通常最終使用原始查詢界面 它看起來有點復雜,但希望它有意義:

  • 選擇Threads並使用ThreadContact表連接
  • Thread.id分組
  • 使用聯系人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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM