我正致力于在sequelize中转换我的所有查询。 我遇到的问题是,当select查询包含关联(例如一对多)时,我得到的对象是一组嵌套对象。
它看起来像:
[
{
"field1": "someval",
"field2": "someval1",
"assoc_table": {
"field_a": 1,
"field_b": "someval"
}
},
{
"field1": "someval",
"field2": "someval3",
"assoc_table": {
"field_a": 5,
"field_b": "someval"
}
},
{
"field1": "someval",
"field2": "someval3",
"assoc_table": {
"field_a": 12,
"field_b": "someval"
}
}
]
我尝试使用不同的模块来展平对象(在循环内部,每个对象单独),但我总是得到一个错误,告诉我试图压扁的不仅仅是对象。
此外,我宁愿避开物体被压平的部分,也只是用续集来得到平坦的结果。
sequelize代码看起来像这样:
models.table1.findAll({
attributes: ['field1', 'field2'],
where: {field1: someval},
include: [{model: models.assoc_table, required: true, attributes:['field_a', 'field_b']}]
}).then(function (result) {
res.send(result);
}).catch(function(error) {
console.log(error);
});
答案 0 :(得分:1)
您的部分问题可能是您的result
是一个模型实例数组,因此如果您没有对数组中的元素调用toJSON
,则可能会遇到问题。 。我提供的代码会使你的例子变得扁平化:
result.forEach(obj => {
Object.keys(obj.toJSON()).forEach(k => {
if (typeof obj[k] === 'object') {
Object.keys(obj[k]).forEach(j => obj[j] = obj[k][j]);
}
});
});
您还可以将raw: true
添加为findAll
选项,这会使您的对象变平,但它将如下所示:
[
{
"field1": "someval",
"field2": "someval1",
"assoc_table.field_a": 1,
"assoc_table.field_b": "someval"
},
...
]
答案 1 :(得分:0)
一个老问题,但是当我也尝试这样做时,发现了一个不需要“之后”映射的纯序列化解决方案,我想在这里添加它。因此,要使序列本身返回所需的对象格式,就是这样,其中attributes
是根据include
表中的列返回值显式分配的:
models.table1.findAll({
attributes: [
'field1',
'field2',
[sequelize.col('models.assoc_table.field_a'), 'field_a'], // Set key
[sequelize.col('models.assoc_table.field_b'), 'field_b'], // Set key
],
where: {field1: someval},
include: [
{model: models.assoc_table,
required: true,
attributes:[], // Explicitly do not send back nested key's
}
]
})