【mysql】sequelize连表查询嵌套太深
多表连接查询数据嵌套过深有没有遇到?
以前是连四张表成功时返回的数据。
大致一张发布表,一张评价表(谁回复谁),一张用户表,一张主题表。
有的对象其实不想嵌套的。比如
通过uid查找谁发布的,user对象里边的内容能否直接解放出去?
同理topicId查找到的主题
有没有什么方法合并,解决嵌套对象。???
await infoListModel.findAll({include:[{
model:User,
attributes:{exclude:['updatedAt','unionId','createdAt','gender']}
},
{
model:Topic,
attributes:{exclude:['updatedAt','unionId','createdAt','gender']}
},{
// 评论
model:commentModel,
attributes:{exclude:['createdAt']},
include:[{
model:User,
as:'from',
attributes:["uid","username"]
},{
model:User,
as:'to',
attributes:["uid","username"]
}],
},
// 点赞
{
model:thumbsUp,
include:{
model:User,
attributes:["uid","avatar"]
}
// attributes:{exclude:['updatedAt','unionId','createdAt','gender']}
}],
attributes:{exclude:['createdAt']},
order:[['updatedAt','DESC']]
})
{
"infoId": 1,
"uid": 1,
"topicId": 1,
"content": "1",
"like_count": 21,
"post_count": 1,
"updatedAt": "2018-06-06T07:10:33.000Z",
"user": {
"uid": 1,
"username": "陈二",
"avatar": "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTIHmiadgySExiakKxsHobq70sxZDyic1BORkNqJ5nezISMeZoh1om6ysG53dbAoYjK0FetXV83O8icUiaw/132"
},
"topic": {
"topicId": 1,
"title": "孤独",
"des": "你有朋友吗,有那种可以深夜想聊天,一个电话就能找到的朋友。没有吧"
},
"comments": [
{
"id": 2,
"infoId": 1,
"from_uid": 1,
"to_uid": 1,
"topic_id": 1,
"content": "nidayede",
"from": {
"uid": 1,
"username": "陈韦4"
},
"to": {
"uid": 1,
"username": "六六"
}
},
{
"id": 3,
"infoId": 1,
"from_uid": 1,
"to_uid": 1,
"topic_id": 1,
"content": "nidayede",
"from": {
"uid": 1,
"username": "琪琪"
},
"to": {
"uid": 1,
"username": "让她"
}
},
{
"id": 1,
"infoId": 1,
"from_uid": 1,
"to_uid": 2,
"topic_id": 1,
"content": "1",
"from": {
"uid": 1,
"username": "哈哈"
},
"to": {
"uid": 2,
"username": "陈"
}
}
],
"thumbsUps": [
{
"id": 1,
"infoId": 1,
"uid": 1,
"user": {
"uid": 1,
"avatar": "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTIHmiadgySExiakKxsHobq70sxZDyic1BORkNqJ5nezISMeZoh1om6ysG53dbAoYjK0FetXV83O8icUiaw/132"
}
},
{
"id": 2,
"infoId": 1,
"uid": 1,
"user": {
"uid": 1,
"avatar": "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTIHmiadgySExiakKxsHobq70sxZDyic1BORkNqJ5nezISMeZoh1om6ysG53dbAoYjK0FetXV83O8icUiaw/132"
}
}
]
}
回答
可以这样解决:
首先假设模型 A,B,C:
AModel:{ id: 'a', name: 'a_name', b_id: 'b' }BModel: { id: 'b', name: 'b_name', c_id: 'c' }
CModel: { id: 'c', name: 'c_name' }
其次以这样的格式:
const data = await AModel.findOne({ where,
raw: true,
attributes: {
include: [
[sequelize.col('B.id'), 'b_id'],
[sequelize.col('B.name'), 'b_name'],
[sequelize.col('B.C.id'), 'c_id'],
[sequelize.col('B.C.name'), 'c_name']
]
},
include: [{
model: BModel,
attributes: [],
include: [{
model: CModel,
attributes: []
}]
}]
})
最后输出结果是:
{ "id": "a",
"name": "a_name",
"b_id": "b",
"b_name": "b_name",
"c_id": "c",
"c_name": "c_name"
}
说明:
- A,B,C 已用关系连接,比如 hasOne、belongsTo 等等,这样可以使用 include;
- 在 AModel 的 attributes 内的 include,是数组,是输出 A 结果之外新增的属性,这样可以避免把 A 结果属性都写一遍的麻烦;
- 注意 raw: true,sequelize.col 内包含的就是其形式下的属性名(最后一个字段名同数据库字段名称,比如使用的 userId,但是数据库存储的 user_id,这里就要写 user_id)
参考文档:
Associations - 关联
- 这还算深么。。如果
user
,topic
里有重名字段怎么办?还有就是comments
这种数组期望的结果是什么? - 如果1中的问题都已经想好了,那也可以,想要扁平部分用
attributes
和sequelize.literal
,想要结构部分用include
。 - 其实查询出来再格式化数据会好很多。
以上是 【mysql】sequelize连表查询嵌套太深 的全部内容, 来源链接: utcz.com/a/75556.html