我有一个可以有子类别的类别
当我做findAll的时候,我想包括所有嵌套的,但我不知道深度。
var includeCondition = {
include: [
{
model: models.categories,
as:'subcategory', nested: true
}]
};
models.categories.findAll(includeCondition)
.then(function (categories) {
resolve(categories);
})
.catch(function (err) {
reject(err);
})
});
结果只显示一个嵌套的include级别。
[
{
dataValues:{
},
subcategory:{
model:{
dataValues:{
}
// no subcategory here
}
}
}
]
我能以某种方式使sequalize包含那些嵌套的子类别吗?
6条答案
按热度按时间yebdmbv41#
有几个解决方案,如果发现这个第一个更复杂,但将给予更好的性能:
这是关于在MySQL中实现分层数据结构的,我喜欢这里的指南
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
这个模型叫做嵌套集合模型。
我自己实现的第二个解决方案是递归扩展,这个解决方案使用了大量的mysql请求,我相信可以改进,但它是一个快速的解决方案,效果很好。
所以它遍历类别并递归地扩展它们。
也许这也能帮助到别人。
t98cgbkg2#
这是ihoryam在ES6上的答案,使用
async/await
,箭头函数() =>
和Sequelize ORM来获取数据,而不是使用Lodash。异步函数返回promise,不需要精确的
return new promise(...)
w46czmvw3#
有一个节点模块来处理它:sequelize-hierarchy
它将列 parentId 和 hierarchyLevel 添加到您的表中。作为一个示例,这是我在树中对员工技能进行排序时所做的。
技能可以是“Macro”-〉“Excel”-〉“Office”-〉“Computer”
database.js:
skill.js:
然后在您的控制器中:
b0zn9rqh4#
Sequelize目前不支持通用表表达式和递归CTE。如果在find* 方法家族中添加包含CTE的功能,则find* 将可以执行递归查询。
这里是例子的链接。
Common Table Expressions and Recursive Queries
f1tvaqid5#
sequelize-hierarchy与Sequelize v6不兼容。这是我在尝试Etienne Duverney代码后从ChatGPT得到的:
这将给予你所有给定id的后代。如果没有孩子,值将是空数组[]。
sxpgvts36#
假设你有5个不同的模型A、B、C、D、E,A与B相关联,B与C相关联,以此类推。
include: [{ all: true, nested: true }]
示例:
A.findAll(where:{// add conditions}, { include: [{ all: true, nested: true }]});