带knex和node.js的嵌套数组

安德森·纽恩斯

我当前在数据库中有一个表,用于注册系统菜单,该表称为菜单,并且具有字段id_menu,dsc_menu和parent_item。id_menu是自动递增的,parent_item接收其主菜单项的id_menu。在这种情况下,它们成为子菜单。事实证明,我已经尝试过多种方法来嵌套查询,即主菜单项,如果有一个,则为一个包含所讨论项子菜单的节点,以生成json。我考虑过要进行第一个查询,这只会给我带来主菜单,然后我将在此数组中进行一次foreach,获取id_menu,然后仅对具有parent_item = id_menu的项目进行新查询。然后,我可以再次连接此数据,并将其转换为完整的数组。我在我的想法下面做了一个概述,但是,它没有用。

// here I take all the parent menus
var result = await knex.raw("SELECT * FROM menus WHERE parent_item is null");

result[0].forEach(element => { 

    // Here I need to use the parent menu id to get the child menus and add them to a new array that will be inside the "submenus" element of the main array.
    if(element.num_sub_menus > 0) {
         var jsonSubMenus = await knex.raw("SELECT dsc_menu FROM menus WHERE parent_item = ?", element.num_sub_menus);
         // if I try to call the knex again here, using await, it gives an error and if I don't use awaita it returns an empty promisse.
    }

    resultado += '{';
    resultado += '"id_menu_admin": ' + element.id_menu_admin + ',';
    resultado += '"dsc_menu": "' + element.dsc_menu + '",';
    resultado += '"parent_item": ' + element.parent_item + ',';
    resultado += '"rota": "' + element.rota + '",';
    resultado += '"icone": "' + element.icone + '",';
    resultado += '"num_sub_menus": ' + element.num_sub_menus + ',';
    resultado += '"submenus": ['+jsonSubMenus+']';
    resultado += '},';}
);

对于子查询,如果我不使用await,则返回一个空promise,例如,如果我不使用await,则给出编译错误。

我认为必须有一种更专业的方法来完成此任务,即通过单个查询带来一个嵌套数组。记住我的菜单项和子菜单在同一张表中。

一定的表现

虽然你可以使用一个for循环,而不是forEachawait会内允许的,它会更好地使用有所不同的方法-使用Promise.all,使所有的子菜单,在一次查询,并行,进而构建resultado

看起来像是resultadoJSON,因此您应该使用对象文字,然后再JSON.stringify进行手动串联。类似于以下内容:

const getSubmenus = elm => elm.num_sub_menus > 0
  ? knex.raw("SELECT dsc_menu FROM menus WHERE parent_item = ?", elm.num_sub_menus)
  : null;
const withSubmenus = await Promise.all(result[0].map(
  elm => Promise.all([element, getSubmenus(element)])
);
const resultArr = withSubmenus.map(([e, submenus]) => ({
  id_menu_admin: e.id_menu_admin,
  dsc_menu: e.dsc_menu,
  // ...,
  ...(submenus ? { submenus } : {})
}));
const resultJSON = JSON.stringify(resultArr);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章