几天来,我一直在努力寻找使用Sequelize的两个用户之间是否存在对话。我有conversation
,message
,user
和userConversations
之间的关系。下面是一个表的外观:
这是我的userConversations
表,我想要的是找到是否有2个或x个用户之间的现有会话。
下面是关系和查询:
db.conversations.hasMany(db.messages, {
foreignKey: 'conversationId',
});
db.messages.belongsTo(db.conversations);
db.conversations.belongsToMany(db.users, { through: db.userConversations });
db.users.belongsToMany(db.conversations, { through: db.userConversations });
db.conversations.hasMany(db.userConversations, {
foreignKey: 'conversationId',
});
db.userConversations.belongsTo(db.conversations);
db.messages.belongsTo(db.users, { as: 'sender' });
下面是NOT
工作查询,我想要的是检查是否存在针对给定用户ID(如[2,3]
或[1,3]
或[x, y, ...]
)的现有转换
let conversationDB = await db.conversations.findOne({
include: [
{
model: db.userConversations,
where: { userId: { [Op.in]: [2, 3] } }, <=== HARDCODED [2,3] for the example
},
});
以下是我不同意的结果:
{
"id": 5,
"userConversations": [
{
"id": 8,
"conversationId": 5,
"userId": 2
}
]
}
我期望严格匹配[2, 3]
,所以我期望严格有两个条目,这是我想要的
{
"id": 5,
"userConversations": [
{
"id": 9,
"conversationId": 6,
"userId": 2
},
{
"id": 10,
"conversationId": 6,
"userId": 3
}
]
}
也试过这个但不起作用
let conversationDB = await db.conversations.findOne({
include: [
{
model: db.userConversations,
where: { userId: { 2 } },
},
{
model: db.userConversations,
where: { userId: 3 },
},
],
group: ['conversations.id'],
having: Sequelize.literal('COUNT(DISTINCT userConversations.userId) = 2'),
});
任何提示或想法将是如此有帮助,有一个美好的一天。
2条答案
按热度按时间js5cn81o1#
从SQL中可以为数据模型提供一个简单的聚合方法。
逻辑是针对用户a、B、c,如果我们有一个计数为3的对话,那么对话存在于他们之间。
因此,使用此方法,您可以反向查找对话对象。
比如
我在Sequelize有点生疏,所以不知道语法是否会100%工作。如果它不工作,你找到正确的语法注解,我会编辑答案。
nmpmafwu2#
这是我第一次没有任何错误,但现在除了
[]
之外什么都没有返回。下面是用户
userConversations
表: