从行中获取值,并与Sequelize关联

我使用Sequelize,MySQL和Node来编写Web应用程序。

对于我的大部分数据库需求,我通常会进行一些validation,然后提取我的模型(热切地与关联)并将它们发送回客户端,几乎总是按照原样(至less到现在为止)。

我写了一个小的实用函数getValuesFromRows从一个返回的行数组中提取值:

 getValuesFromRows: function(rows, valuesProp) { // get POD (plain old data) values valuesProp = valuesProp || 'values'; if (rows instanceof Array) { var allValues = []; for (var i = 0; i < rows.length; ++i) { allValues[i] = rows[i][valuesProp]; } return allValues; } else if (rows) { // only one object return rows[valuesProp]; } return null; } // ... ...findAll(...)...complete(function(err, rows) { var allValues = getValuesFromRows(rows); sendToClient(errToString(err, user), allValues); }); 

但是,我将更多,更复杂的关系添加到我的数据库模型中。 结果,我得到更多的协会,我必须取。 现在,我不仅需要调用上面的函数来获取每行的values ,而且还需要更复杂的实用程序来从所有包含的(热切加载的)关联中获取values 。 有没有一种方法只从Sequelize查询(而不是Sequelize模型实例)获取值,该值也包含实例中的所有关联值?

否则,我将不得不手动“从每个Project获取所有values ,并为Project.members的每个条目的values属性添加一个项目到values对象”(例如)。 请注意,如果您嵌套关联(例如成员具有taskstasks具有此等等),事情会变得更快。

我猜我必须自己编写这样的实用程序?

我发现我的问题的一个简单的解决scheme,通过扩展我的现有的POD转换函数与recursion到所有include查询的关联。 该解决scheme适用于findfindAllall和其他可能的操作,而且结果不重要。

 /** * Get POD (plain old data) values from Sequelize results. * * @param rows The result object or array from a Sequelize query's `success` or `complete` operation. * @param associations The `include` parameter of the Sequelize query. */ getValuesFromRows: function(rows, associations) { // get POD (plain old data) values var values; if (rows instanceof Array) { // call this method on every element of the given array of rows values = []; for (var i = 0; i < rows.length; ++i) { // recurse values[i] = this.getValuesFromRows(rows[i], associations); } } else if (rows) { // only one row values = rows.dataValues; // get values from associated rows if (values && associations) { for (var i = 0; i < associations.length; ++i) { var association = associations[i]; var propName = association.as; // recurse values[propName] = this.getValuesFromRows(values[propName], association.include); }; } } return values; } 

 var postAssociations = [ // poster association { model: User, as: 'author' }, // comments association { model: Comment, as: 'comments', include: [ { // author association model: User, as: 'author' } ] } ]; // ... var query = { where: ... include: postAssociations; }; // query post data from DB return Post.findAll(query) // convert Sequelize result to POD .then(function(posts) { return getValuesFromRows(posts, postAssociations); }) // send POD back to client .then(client.sendPosts); 

在上面的例子中, client.sendPosts接收一个数组。 数组的每个条目都有属性authorcommentscomments数组中的每个注释也将具有一个author属性。 整个数组只包含POD(普通的旧数据)。