#mysql #node.js #express #sequelize.js #associations
#mysql #node.js #выразить #sequelize.js #ассоциации
Вопрос:
У меня есть таблица меню с самоассоциацией «один ко многим», так что в основном структура выглядит так
---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=[]
часть результата, что мне нужно, так это то, что при отсутствии подменю оно не должно возвращаться 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,
});
Спасибо, что просмотрели мой вопрос 🙂
Ответ №1:
Рекурсивный вызов для удаления этих подменю будет работать, если в подменю нет дочерних элементов, его следует удалить, иначе дочерние узлы этого меню должны обрабатываться до тех пор, пока не будет найдено пустое подменю.
cleanMenusObject = async (menuToUpdate) => {
for (const { dataValues } of menuToUpdate) {
if (dataValues.submenu) {
const { submenu } = dataValues;
if (!submenu.length) {
delete submenu;
return;
} else {
await cleanMenusObject(submenu);
}
}
}
};