我正在使用Sequelize,MySQL和Node来编写Web应用程序。
对于我的大多数数据库需求,我通常会进行一些验证,然后获取我的模型(热切地关联)并将它们发送回客户端,几乎总是按原样(至少到现在为止)。
我写了一个小实用函数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模型实例)获取值,该查询还包括实例中的所有相关值?
否则,我必须手动&#34;从每个values
获取所有Project
,并为每个values
对象添加一个项目以获取每个values
属性Project.members
&#34;的输入(例如)。请注意,如果您嵌套关联,事情会变得更快(例如,成员有tasks
和tasks
有此等等。)
我猜我自己必须写这样的实用程序?
答案 0 :(得分:3)
我找到了一个解决我问题的简单方法,通过将上面现有的POD转换函数扩展到查询的所有include
'd关联中。该解决方案适用于find
,findAll
,all
以及其他可能具有非平凡结果的操作。
<强>代码强>
/**
* 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
接收一个数组。数组的每个条目都具有属性author
和comments
。 comments
数组中的每个注释也将具有author
属性。整个数组只包含POD(普通旧数据)。