gpt4 book ai didi

node.js - 使用 sequelize 构建查询的问题

转载 作者:行者123 更新时间:2023-12-03 22:38:22 27 4
gpt4 key购买 nike

我在 Sequelize 中重新创建以下查询时遇到问题。我已经坐了几个小时试图弄清楚这一点。

我使用的是camelCase 而不是snake_case,所以我不能重用相同的查询。

如果我在查询中将所有 snake_cased 变量交换为 camelCase,则查询不起作用。我回复“关系\”直接消息\“不存在”。我无法使用 TABLE directmessages 访问 psql 中的 directmessages 表; - 但我知道它应该在那里。

我也无法弄清楚如何使用 sequelize 执行相同的查询。

基本上我需要获取当前用户已经直接与之发送消息的每个用户。无论是作为发送者还是接收者。

  models.sequelize.query(
'select distinct on (u.id) u.id, u.username from users as u join direct_messages as dm on (u.id = dm.sender_id) or (u.id = dm.receiver_id) where (:currentUserId = dm.sender_id or :currentUserId = dm.receiver_id) and dm.team_id = :teamId',
{
replacements: { currentUserId: user.id, teamId: id },
model: models.User,
raw: true,
},

这些是此查询的相关模型:

用户模型:
User.associate = (models) => {
User.belongsToMany(models.Team, {
through: models.Member,
foreignKey: 'userId',
})
User.belongsToMany(models.Channel, {
through: 'channel_member',
foreignKey: 'userId',
})

}

直接消息模型:
DirectMessage.associate = (models) => {
DirectMessage.belongsTo(models.Team, {
foreignKey: 'teamId',
})
DirectMessage.belongsTo(models.User, {
foreignKey: 'receiverId',
})
DirectMessage.belongsTo(models.User, {
foreignKey: 'senderId',
})
}

我尝试使用 sequelize 创建查询,如下所示:
models.User.findAll({ 
include:[{
model: models.DirectMessage,
where: {
teamId,
[models.sequelize.Op.or]: [{senderId: user.id}, {receiverId: user.id}]
}
}]
}, { raw: true })

我得到“消息”:“directMessage 与用户无关!”,我认为这是因为 DirectMessage 与用户相关联,而不是相反。

有没有人对我如何重建这个查询有任何提示?

最佳答案

这里有几件事。首先,当您使用 belongsToMany 时,您需要对两个模型进行 te 关联,因为这是一个 M:N 关系,如下所示:
此外,您在关联上的 foreignKey 错误。应该是这样的:

User.associate = (models) => {
User.belongsToMany(models.Team, {
through: models.Member,
foreignKey: 'user_id',
})

models.Team.belongsToMany(User, {
through: models.Member,
foreignKey: 'team_id',
})

// ----------------------------------
User.belongsToMany(models.Channel, {
through: 'channel_member',
foreignKey: 'user_id',
})

models.Channel.belongsToMany(user, {
through: 'channel_member',
foreignKey: 'channel_id',
})

}

现在为了能够在 javascript 和 sequelize 上使用驼峰命名,并在 sql 上保留 snake_case,你可以这样做:
module.exports = (sequelize, DataTypes) => {
const Member = sequelize.define('Member', {
// here goes your regular fields
userId: { //now you can use this property on sequelize
field: 'user_id', //and is linked yo the foreignKey
type: DataTypes.INTEGER
},
teamId: {
field: 'team_id',
type: DataTypes.INTEGER
}
}
}

您对包含的最后一个问题是,因为您必须指定要调用的关联,正如您所说,您需要
以另一种方式声明关联,从 UserDirectMessage :
User.hasMany(models.DirectMessage, { //there is also hasOne()
as: 'Sender', // this is important because you have two association from User to DirectMessage
foreignKey: 'sender_id',
})

User.hasMany(models.DirectMessage, { //there is also hasOne()
as: 'Receiver', // this is important because you have two association from User to DirectMessage
foreignKey: 'user_id',
})

现在你可以做你的查询
models.User.findAll({ 
include:[{
model: models.DirectMessage,
as: 'Sender'
where: {
teamId,
}
}]
}, { raw: true })

我对这个查询表示怀疑,因为实际上您正在调用所有 DirectMessages,因此 senderIdreceiverId 过滤器没有多大意义。

无论如何,希望对此有更好的主意。

关于node.js - 使用 sequelize 构建查询的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55013721/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com