NODE JS和MySQL外键多级JSON对象

时间:2018-09-19 01:51:43

标签: mysql json node.js

我正在将NODEJS和MySQL用于API服务器,但遇到了问题。由于外键,我正在运行的查询有多行结果。

User Table           Address Table
|id|  name|         |id|user_id|                        Address|
| 1| frank|         | 1|      1|       123 main street, Moncton|
| 2| steve|         | 2|      2|97 duplessie street, Edmundston|
                    | 3|      2|    933 manhole av, Grand Sault|

如何为查询结果或至少为API响应获取如下所示的多级json对象。

{
  "id":1,
  "name": "frank",
  "addresses": [
    {"id":1,"Address":"123 main street, Moncton"}
  ]
},
{
  "id":2,
  "name": "steve",
  "addresses": [
    {"id":2,"Address":"97 duplessie street, Edmundston"},
    {"id":3,"Address":"933 manhole av, Grand Sault"}
  ]
}

2 个答案:

答案 0 :(得分:0)

如果您仅运行原始查询,则得到的结果就是得到的结果。对象关系映射库(例如Objection,Bookshelf或Sequelize)将自动为您处理此问题,但可能涉及比您想要的更多的设置和/或抽象。

如果您希望将其保持在最小限度,则始终可以自己处理结果数组。不久前,我在自己的项目(用于Postgres的数据映射器)中遇到了这个确切的问题,并开发了decomposer,您应该可以毫无问题地吞噬。有关构建架构,请参见docs

答案 1 :(得分:0)

我按照@dmfay的指示提出了一个对我有用的解决方案。

此函数,我传递2个JSON对象以将地址合并到用户JSON中,并在单个JSON对象中返回所有内容。

function combineResults(users, addresses){
  ***********************************
  *** Go through each user object ***
  ***********************************
  users.forEach(function(user) {
      user.addresses = addresses.find(address => address.user_id === user.id);
  }

  return users;
}