如何通过循环从两个查询中生成数组



我真的想让主数组具有外键的属性

我有两张桌子——tipe_akademik和jam_akademik_a

那么jam_akademik有tipe_akademak 的外键

下一个我想作为tipe_akademik显示的jam_akademik_a列表被称为list_mapel

我想使阵列像:

{
"data": [
{
"id": 1,
"tipe_akademik": "a",
"listmapel": [{//from jam_akademik_a//
"id": 1,
"mapel": "Pendidikan Agama Islam",

"tipe_aka": 1
},
{
"id": 10,
"mapel": "Bahasa Indo",

"tipe_aka": 1
}
]
}, and etc

在我的数组顶部,第一个id是tipe_akademik的主键,而tipe_aka是该id的外键,然后我尝试从2个查询中创建1个数组

我的源代码

router.get('/test', function (req ,res) {

//query

let tipe= []

connection.query(`SELECT * FROM tipe_akademik  `,  function (err, result){
tipe=result

let i = 0
for (let mapeltipe of tipe ){connection.query ('SELECT * FROM jam_akademik_a WHERE tipe_aka = ? '  ,[mapeltipe.id] ,function (err, listmapel){
tipe[i].listmapel = listmapel
i++
}
)}return res.status(500).json ({data: tipe}) 
}
)
});

但当我返回它时,数组提示仍然只显示第一个查询。我为循环所做的数组没有保存在数组提示中。如果有人能帮我的话,谢谢…在一个数组中用循环进行2个查询。

您需要做两件事。

  1. 您的结果将在回调函数中返回,因此您的return语句将无法按预期工作。您必须将结果await。我建议您在谷歌上搜索JavaScript async/await以获取更多详细信息和解释。这个线程可能也有帮助
  2. 我假设您的表是通过外键连接的,所以您应该在SQL查询中使用它。让数据库为您完成繁重的工作,而不是用JavaScript自己完成,这就是您拥有数据库的目的。您可以执行所谓的INNER JOIN,以便组合(它实际上是给定列值的交集)这两个表。如果您不熟悉,我建议您也在谷歌上搜索SQLJOIN

应用这两项更改后,您最终会得到类似的解决方案。

免责声明:这是未经测试的,为了创建查询,我不得不对数据库字段名进行一些假设,但从概念上讲,这应该有效。

// you can only use async in an async function so make the function async
router.get("/test", async function (req, res) {
// await until the Promise is rejected or resolved
const data = await getDatabaseData();
return res.status(500).json({ data: data });
});
async function getDatabaseData(){
// return a promise immediately and once the callback returns return an error (reject the promise) or the data (resolve the promise) 
return new Promise((resolve, reject) => {
// That's a guess but if you have a foreign key you can JOIN, just search for SQL JOIN and you will find lots of examples/ explanations 
connection.query(`SELECT * FROM tipe_akademik AS t INNER JOIN jam_akademik_a AS j ON j.listmapel = t.tipe_aka;`, (err, result) => {
// if an error occurred reject promise
if(err) reject(err);
// we have the data so we can resolve the promise
else resolve(result);
})
})
}

最新更新