2015-12-07 3 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    
     } 
     } 
    } 
] 

Могу ли я каким-либо образом описать эти вложенные подкатегории?

ответ

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); 
      } 
     }); 
    }); 
}; 

Так происходит через категорию и расширение их рекурсивно.

Возможно, это тоже поможет кому-то.

Смежные вопросы