iho*_*yam 5 javascript mysql orm sequelize.js
我有可以有子类别的类别
当我执行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);
})
});
Run Code Online (Sandbox Code Playgroud)
结果使我只嵌套了一个级别的包含。
[
{
dataValues:{
},
subcategory:{
model:{
dataValues:{
}
// no subcategory here
}
}
}
]
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式使sequalize包含那些嵌套的子类别吗?
如果找到第一个更复杂但会提供更好性能的解决方案,则很少有解决方案:
这是关于在 MySQL 中实现分层数据结构我喜欢这里的指南
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
一种名为嵌套集模型的模型。
我自己实际实现的第二个解决方案是递归扩展,这个解决方案使用了大量的 mysql 请求,我相信可以改进,但它是一个快速且运行良好的解决方案。事情是像这样用于每个类别功能
var expandSubcategories = function (category) {
return new promise(function (resolve, reject) {
category.getSubcategories().then(function (subcategories) {
//if has subcategories expand recursively inner subcategories
if (subcategories && subcategories.length > 0) {
var expandPromises = [];
_.each(subcategories, function (subcategory) {
expandPromises.push(expandSubcategories(subcategory));
});
promise.all(expandPromises).then(function (expandedCategories) {
category.subcategories = [];
_.each(expandedCategories, function (expandedCategory) {
category.subcategories.push(expandedCategory);
}, this);
//return self with expanded inner
resolve(category);
});
} else {
//if has no subcategories return self
resolve(category);
}
});
});
};
Run Code Online (Sandbox Code Playgroud)
所以它遍历类别并递归地扩展它们。
也许这也会对某人有所帮助。
小智 5
这是 ihoryam 适应 ES6 的答案,使用async/await、箭头函数() =>和 Sequelize ORM 来获取数据,而不是使用 Lodash。
const getSubCategoriesRecursive = async (category) => {
let subCategories = await models.category.findAll({
where: {
parentId: category.id
},
raw : true
});
if (subCategories.length > 0) {
const promises = [];
subCategories.forEach(category => {
promises.push(getSubCategoriesRecursive(category));
});
category['subCategories'] = await Promise.all(promises);
}
else category['subCategories'] = [];
return category;
};
Run Code Online (Sandbox Code Playgroud)
异步函数返回承诺,您不需要精确return new promise(...)