使用 Sequelize 排除空关联数组
Exclude Empty association array using Sequelize
我有一个菜单 table 具有一对多的自关联,所以基本上结构是这样的
---Menu
|
'--submenu
|
'--submenu
---secondMenu
|
'--submenu
|
'--submenu
|
'--submenu
---thirdMenu
考虑没有任何子菜单的第三个菜单。在那种情况下,我希望子菜单字段为空,或者不应附加该字段。我得到的结果类似于
"menu": [
{
"name": "Settings",
"id": 37,
"slug": "Settings-ecom",
"url": "/Settings",
"submenu": [
{
"name": "Settings-child1",
"id": 38,
"slug": "Settings-ecom-child1",
"url": "/Settings-child1",
"submenu": [
{
"name": "Settings-child1-child1",
"id": 40,
"slug": "Settings-ecom-child1-child1",
"url": "/Settings-child1-child1",
"submenu": []
}
]
}
]
},
{
"name": "Dashboard",
"id": 30,
"slug": "dashboard-ecommerce",
"url": "/dashboard",
"submenu": []
}
]
考虑结果中的 submenu=[]
部分,我需要的是当没有子菜单时它不应该 return submenu = []
。它要么应该排除子菜单,要么应该像 submenu = null
下面是我获取菜单的查询
const menu = await Menu.findAll({
where: {parent_id: null},
attributes: Constants.attributes,
include: [
{
model: Menu,
as: 'submenu',
attributes: Constants.attributes,
include: [
{
model: Menu,
as: 'submenu',
attributes: Constants.attributes,
},
],
},
],
});
最后协会就像
menu.hasMany(models.menu, {
as: 'submenu',
foreignKey: 'parent_id',
useJunctionTable: false,
});
感谢您查看我的问题:)
好的,所以我找到了解决方案,即从最终结果中递归删除空子菜单对象。希望对某人有所帮助
cleanMenusObject = async (menuToUpdate) => {
for (let menu of menuToUpdate) {
if (menu.dataValues.submenu) {
if (!menu.dataValues.submenu.length) {
delete menu.dataValues.submenu;
} else {
await cleanMenusObject(menu.dataValues.submenu);
}
}
}
};
我有一个菜单 table 具有一对多的自关联,所以基本上结构是这样的
---Menu
|
'--submenu
|
'--submenu
---secondMenu
|
'--submenu
|
'--submenu
|
'--submenu
---thirdMenu
考虑没有任何子菜单的第三个菜单。在那种情况下,我希望子菜单字段为空,或者不应附加该字段。我得到的结果类似于
"menu": [
{
"name": "Settings",
"id": 37,
"slug": "Settings-ecom",
"url": "/Settings",
"submenu": [
{
"name": "Settings-child1",
"id": 38,
"slug": "Settings-ecom-child1",
"url": "/Settings-child1",
"submenu": [
{
"name": "Settings-child1-child1",
"id": 40,
"slug": "Settings-ecom-child1-child1",
"url": "/Settings-child1-child1",
"submenu": []
}
]
}
]
},
{
"name": "Dashboard",
"id": 30,
"slug": "dashboard-ecommerce",
"url": "/dashboard",
"submenu": []
}
]
考虑结果中的 submenu=[]
部分,我需要的是当没有子菜单时它不应该 return submenu = []
。它要么应该排除子菜单,要么应该像 submenu = null
下面是我获取菜单的查询
const menu = await Menu.findAll({
where: {parent_id: null},
attributes: Constants.attributes,
include: [
{
model: Menu,
as: 'submenu',
attributes: Constants.attributes,
include: [
{
model: Menu,
as: 'submenu',
attributes: Constants.attributes,
},
],
},
],
});
最后协会就像
menu.hasMany(models.menu, {
as: 'submenu',
foreignKey: 'parent_id',
useJunctionTable: false,
});
感谢您查看我的问题:)
好的,所以我找到了解决方案,即从最终结果中递归删除空子菜单对象。希望对某人有所帮助
cleanMenusObject = async (menuToUpdate) => {
for (let menu of menuToUpdate) {
if (menu.dataValues.submenu) {
if (!menu.dataValues.submenu.length) {
delete menu.dataValues.submenu;
} else {
await cleanMenusObject(menu.dataValues.submenu);
}
}
}
};