Realmente quiero hacer que la matriz primaria tenga la propiedad de clave externa
tengo 2 mesas la tipe_akademik y jam_akademik_a
Luego, jam_akademik tiene una clave externa para tipe_akademik
El siguiente que quiero mostrar como tipe_akademik tiene una lista de jam_akademik_a que se llama list_mapel
Quiero hacer la matriz como:
{ "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 etcEn la parte superior de mi matriz, la primera identificación es la clave principal de tipe_akademik, mientras que tipe _aka es una clave externa para esa identificación, luego trato de hacer 1 matriz a partir de 2 consultas
mi código fuente
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}) } ) });Pero cuando lo devuelvo, el tipo de matriz aún muestra solo la primera consulta. La matriz que hago para el bucle no se guarda en el tipo de matriz. Gracias si alguien puede ayudarme... por hacer esa consulta 2 en una matriz con el bucle.
Hay dos cosas que debes hacer.
return no funcionará como esperaba. Habrá que await el resultado. Le recomiendo que busque en Google JavaScript async / espere para obtener más detalles y explicaciones. Este hilo también podría ayudar.INNER JOIN para combinar (en realidad es una intersección de los valores de columna dados) las dos tablas. Le recomiendo que también busque en Google SQL JOIN si no está familiarizado.Con ambos cambios aplicados, terminaría con una solución similar a esta.
Descargo de responsabilidad: esto no se ha probado y tuve que hacer algunas suposiciones sobre los nombres de los campos de la base de datos para crear la consulta, pero conceptualmente debería funcionar.
// 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); }) }) }