数据库
首页 > 数据库> > mysql – 仅从行和关联中获取Sequelize的值

mysql – 仅从行和关联中获取Sequelize的值

作者:互联网

我正在使用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);
});

但是,我正在为我的数据库模型添加越来越复杂的关系.结果,我获得了更多我必须获取的关联.现在,我不仅需要调用上面的函数来获取每行的值,而且我还需要更复杂的实用程序来获取所有包含(急切加载)关联的值.有没有办法只从Sequelize查询(而不是Sequelize模型实例)中获取值,该值还包括实例中的所有相关值?

否则,我必须手动“获取每个项目的所有值,并为Project.members的每个条目的values属性添加一个项目到该值对象”(例如).请注意,如果嵌套关联,事情会变得更快(例如,成员有任务和任务都有这个和那个等).

我猜我自己必须写这样的实用工具?

解决方法:

我找到了一个解决我的问题的简单方法,通过将上面的现有POD转换函数扩展到查询的所有include’d关联中.该解决方案适用于find,findAll,所有以及可能具有非平凡结果的其他操作.

/**
 * 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(普通旧数据).

标签:mysql,node-js,associations,sequelize-js
来源: https://codeday.me/bug/20190629/1321287.html