2015-12-07 97 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); 
      } 
     }); 
    }); 
}; 

因此,它正在通過類別和遞歸擴展它們。

也許這也會對別人有幫助。