gpt4 book ai didi

mysql - 使用 sequelize 展平子关联中的列

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

我有三个不同的表,用于保存一组用户的数据、这些组中用户的存在情况以及实际用户数据。仅提取成员数据时,我可以将其全部展平,而无需嵌套

GroupUsers.findAll({
raw: true,
attributes: [
'userID',
'userRole',
[Sequelize.col('User.username'), 'username'],
],
where: {
groupID: 'some group id'
},
include: [
{
model: User,
attributes: []
}
],
})
哪个会返回
{
userID: "1234",
status: "user",
username: "foo",
}
但是,如果我尝试通过以下方式对子关联执行相同的操作
Groups.findOne({
where: {
active: true,
id: 'some group id'
},
include: {
model: GroupUsers,
attributes: [
'userID',
'userRole',
[Sequelize.col('User.username'), 'username'],
],
as: "members",
include: {
model: User,
attributes: []
}
}
})
这不再有效,我收到一个错误,即 members.User.username 是一个未知列。
尝试使用 include 引用 where 子句中的嵌套数据时,会发现类似的问题,例如 with
include: {
model: GroupUsers,
where: {
'$User.username$': 'foo'
}
...
}
再次声明这是一个未知列。
有谁知道是否有正确的方法来做到这一点,我错过了还是 Sequelize 只是不允许在另一个关联中引用子关联,而只允许在顶层进行这种行为?

最佳答案

我已经通过使用 sequelize literal 解决了这个问题,它有点原始但它有效,但你必须知道列之前的所有关联。
在你的情况下,它会是这样的:

Groups.findOne({
where: {
active: true,
id: 'some group id'
},
include: {
model: GroupUsers,
attributes: [
'userID',
'userRole',
[Sequelize.literal('"members->User"."username"'), 'username'],
],
as: "members",
include: {
model: User,
attributes: []
}
}
})
像这样,您应该避免对该属性进行 Sequelize 覆盖。
当您尝试使用 where 子句时回答您的第二种情况,该子句应该在用户内部
include: {
...
include: {
model: User,
attributes: [],
where: {
username: 'foo'
},
required: true
}
}
而不是这个:
include: {
model: GroupUsers,
where: {
'$User.username$': 'foo'
}
...
}

关于mysql - 使用 sequelize 展平子关联中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65206942/

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