从带有关联的 sequelize 返回平面对象

Laz*_*ing 5 json flatten sequelize.js

我正在将我所有的查询转换为 sequelize。The problem I have come across is that when select queries include associations (ex. one to many), the object I get is an array of nested objects.

它看起来像:

[   
  {
    "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"
    }   
   } 
]
Run Code Online (Sandbox Code Playgroud)

我尝试使用不同的模块来展平对象(在循环内,每个对象单独),但我总是收到一个错误,告诉我我试图展平的不仅仅是对象。

此外,我更愿意避免对象被展平的部分,并通过 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);
});
Run Code Online (Sandbox Code Playgroud)

Sco*_*ttS 8

老问题,但当我也尝试这样做并找到一个不需要“之后”映射的纯续集解决方案时,我想在此处添加它。因此,要让sequelize本身返回所需的对象格式,将是这样的,其中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
     }
   ]
})
Run Code Online (Sandbox Code Playgroud)


jjb*_*kir 5

您的问题的一部分可能是您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]);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

您还可以将raw: true选项添加到findAll,这将使您的对象变平,但它看起来像这样:

[   
  {
    "field1": "someval",
    "field2": "someval1",
    "assoc_table.field_a": 1,
    "assoc_table.field_b": "someval"
  },
  ...
]
Run Code Online (Sandbox Code Playgroud)