2015-12-07 91 views
3

我有类别,可以有子类别递归包括Sequelize?

而当我在做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); 
     }) 
}); 

结果给我带来了只有一个级别的嵌套包括。

[ 
    { 
     dataValues:{ 

     }, 
     subcategory:{ 
     model:{ 
      dataValues:{ 

      } 
      // no subcategory here    
     } 
     } 
    } 
] 

我可以以某种方式使sequalize包括嵌套子类别?

回答

2

有几种解决方案,如果发现此 第一个是更复杂,但会提供更好的性能:

这一个是关于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); 
      } 
     }); 
    }); 
}; 

因此,它正在通过类别和递归扩展它们。

也许这也会对别人有帮助。