【发布时间】:2018-06-03 19:51:20
【问题描述】:
我的mysql表模型:
//mysql
//table structures start
var Contact = sequelize.define('contact', {
gsm: {
type: Sequelize.STRING,
unique: true,
required: true
},
firstName: Sequelize.STRING,
lastName: Sequelize.STRING,
street: Sequelize.STRING,
city: Sequelize.STRING,
})
var Group = sequelize.define('group', {
groupname: Sequelize.STRING
})
var ContactGroup = sequelize.define('contactgroup', {
/* Empty */
})
ContactGroup.belongsTo(Contact, {
onDelete: 'CASCADE'
});
Contact.hasMany(ContactGroup, {
onDelete: 'CASCADE'
});
ContactGroup.belongsTo(Group, {
onDelete: 'CASCADE'
});
Group.hasMany(ContactGroup, {
onDelete: 'CASCADE'
});
这是我的第一个 api 代码:
exports.getNewGroup = (req, res) => {
Group.findAll({
attributes: ['id', 'groupname', [sequelize.fn('COUNT', sequelize.col('contactgroups.groupId')), 'contactsCount']],
include: [{
model: ContactGroup,
attributes: ['id']
}],
group: ['id']
}).then(data => {
return res.status(200).send(data);
}).catch(err => {
return res.status(400).send(err.message);
});
};
我得到了第一个这样的 api 响应:
[
{
"id": 14,
"groupname": "Angular",
"contactsCount": 2,
"contactgroups": [
{
"id": 1
}
]
},
{
"id": 15,
"groupname": "React",
"contactsCount": 1,
"contactgroups": [
{
"id": 3
}
]
},
{
"id": 16,
"groupname": "Vue",
"contactsCount": 0,
"contactgroups": []
},
{
"id": 17,
"groupname": "NodeJs",
"contactsCount": 0,
"contactgroups": []
},
{
"id": 18,
"groupname": "RxJS",
"contactsCount": 0,
"contactgroups": []
}
]
这是我的第二个 api 代码:
exports.getNewGroupForProfsms = (req, res) => {
Group.findAll({
include: [{
model: ContactGroup,
attributes: ['id'],
include: [{
model: Contact,
attributes: ['id', 'gsm']
}]
}],
}).then(data => {
return res.status(200).send(data);
}).catch(err => {
return res.status(400).send(err.message);
});
};
这是我的第二个 api 响应:
[
{
"id": 14,
"groupname": "Angular",
"createdAt": "2017-12-15T15:06:39.000Z",
"updatedAt": "2017-12-15T15:06:39.000Z",
"contactgroups": [
{
"id": 1,
"contact": {
"id": 20,
"gsm": "987654321"
}
},
{
"id": 2,
"contact": {
"id": 21,
"gsm": "123456789"
}
}
]
},
{
"id": 15,
"groupname": "React",
"createdAt": "2017-12-15T15:06:45.000Z",
"updatedAt": "2017-12-15T15:06:45.000Z",
"contactgroups": [
{
"id": 3,
"contact": {
"id": 21,
"gsm": "123456789"
}
}
]
},
{
"id": 16,
"groupname": "Vue",
"createdAt": "2017-12-15T15:06:51.000Z",
"updatedAt": "2017-12-15T15:06:51.000Z",
"contactgroups": []
},
{
"id": 17,
"groupname": "NodeJs",
"createdAt": "2017-12-17T16:07:38.000Z",
"updatedAt": "2017-12-17T16:07:38.000Z",
"contactgroups": []
},
{
"id": 18,
"groupname": "RxJS",
"createdAt": "2017-12-21T05:50:50.000Z",
"updatedAt": "2017-12-21T05:50:50.000Z",
"contactgroups": []
}
]
在上面的代码中,我写了两个api,现在我想写一个api,
我需要这种类型的响应:(我在第一个 api 响应中有 contactsCount,我希望在第二个 api 响应中使用)
最后我想要这种类型的响应与单个 api 代码:
[
{
"id": 14,
"groupname": "Angular",
"contactsCount": 2,
"createdAt": "2017-12-15T15:06:39.000Z",
"updatedAt": "2017-12-15T15:06:39.000Z",
"contactgroups": [
{
"id": 1,
"contact": {
"id": 20,
"gsm": "987654321"
}
},
{
"id": 2,
"contact": {
"id": 21,
"gsm": "123456789"
}
}
]
},
{
"id": 15,
"groupname": "React",
"contactsCount": 1,
"createdAt": "2017-12-15T15:06:45.000Z",
"updatedAt": "2017-12-15T15:06:45.000Z",
"contactgroups": [
{
"id": 3,
"contact": {
"id": 21,
"gsm": "123456789"
}
}
]
},
{
"id": 16,
"groupname": "Vue",
"contactsCount": 0,
"createdAt": "2017-12-15T15:06:51.000Z",
"updatedAt": "2017-12-15T15:06:51.000Z",
"contactgroups": []
},
{
"id": 17,
"groupname": "NodeJs",
"contactsCount": 0,
"createdAt": "2017-12-17T16:07:38.000Z",
"updatedAt": "2017-12-17T16:07:38.000Z",
"contactgroups": []
},
{
"id": 18,
"groupname": "RxJS",
"contactsCount": 0,
"createdAt": "2017-12-21T05:50:50.000Z",
"updatedAt": "2017-12-21T05:50:50.000Z",
"contactgroups": []
}
]
有人会帮助我吗?我需要单个 api 代码。
我尝试了嵌套查询,并像这样修改了我的第一个 api 代码:
exports.getNewGroup = (req, res) => {
Group.findAll({
attributes: ['id', 'groupname', [sequelize.fn('COUNT', sequelize.col('contactgroups.groupId')), 'contactsCount']],
include: [{
model: ContactGroup,
attributes: ['id'],
include: [{
model: Contact,
attributes: ['id', 'gsm']
}]
}],
group: ['id']
}).then(data => {
return res.status(200).send(data);
}).catch(err => {
return res.status(400).send(err.message);
});
};
但我得到了这种类型的回应不是我的要求
[
{
"id": 14,
"groupname": "Angular",
"contactsCount": 2,
"contactgroups": [
{
"id": 1,
"contact": {
"id": 20,
"gsm": "987654321"
}
}
]
},
{
"id": 15,
"groupname": "React",
"contactsCount": 1,
"contactgroups": [
{
"id": 3,
"contact": {
"id": 21,
"gsm": "123456789"
}
}
]
},
{
"id": 16,
"groupname": "Vue",
"contactsCount": 0,
"contactgroups": []
},
{
"id": 17,
"groupname": "NodeJs",
"contactsCount": 0,
"contactgroups": []
},
{
"id": 18,
"groupname": "RxJS",
"contactsCount": 0,
"contactgroups": []
}
]
【问题讨论】:
-
你可以在第一个api中嵌套查询组,或者在你的sql中使用
right join,但是为了更好的性能和设计,请参考docs.sequelizejs.com/manual/tutorial/… -
你能发布一些代码吗?如果我在我的第一个 api 中嵌套查询,我没有得到正确的响应,等待我将发布我尝试过的嵌套查询代码。
-
@JoshLin 查看我更新的问题,我编写了嵌套包含代码。
-
您只希望在第二个 API 中使用
contactsCount?类似res.send(data.map((x)=>{...x,contactsCount:x.contactgroups.length}))? -
@JoshLin 我是 nodejs 的新手,我可以在哪里发布此代码?是的,我只需要联系人数,你能发布一些答案吗?
标签: mysql json node.js api sequelize.js