JSON 的 Structure 可以像一個樹一樣去表達資料,但是傳統的 Relational Database 只可以使用一張張的 Table 來儲存資料,如果要把數張 Table 的內容合併為一個 JSON 來使用的話,可以通過使用 mapping 的方法把關聯的 ID 值串合起來。
### 例子
考慮到有以下的資料:
Table: users
|id|name|age|
|---|
|1|peter|11|
|2|tom|12|
|3|mary|13|
Table: user_fruits
|id|user_id|fruit|
|---|
|1|1|apple|
|2|1|orange|
|3|2|apple|
|3|2|banana|
|3|3|orange|
|3|3|banana|
|3|3|apple|
考慮到要抽出以下的 JSON 格式 :
```json
[
{"name":"peter", "age": 11, fruits:["apple","orange"]},
{"name":"tom", "age": 12, fruits:["apple","banana"]},
{"name":"mary", "age": 13, fruits:["orange","banana","apple"]}
]
```
應該要如何轉換呢?
### 解決方法
使用 Loop 是必需要的,因為而一個個 Data Object 互相 Mapping。不過在語法上可以使用 JS 一句內完成的。
```js
users.forEach(user => user.fruits = userFruits.filter(userFruit => user.id === userFruit.user_id).map(userFruit => userFruit.fruit));
```
以下是一個完整的示範 :
```js
// get users
var users = await db.query(`select * from users`);
// fetch user id as array
var userIds = users.map(user => user.id);
// check users is empty
if( users.length > 0 ) {
// fetch user fruits by user id
var userFruits = await db.query(`select * from user_fruits where user_id in (?)`, [userIds]);
// map user fruit data to users
users.forEach(user => user.fruits = userFruits.filter(userFruit => user.id === userFruit.user_id).map(userFruit => userFruit.fruit));
}
```