[英]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.