序列化原始findAll返回不需要的ID列

时间:2018-08-27 18:02:03

标签: javascript node.js sequelize.js

我正在使用Sequelize使用INNER JOINS进行SELECT查询,如下例所示:

let result=await model.findAll({
  attributes:[['att1', 'alias1'], ['att2', 'alias2']],
  include:[{
    model:model1,
    attributes:[['att3', 'alias3']],
    include:[{
      model:model2,
      attributes:[['att4', 'alias4']]
    }] 
  }],
  limit:50,
  raw:true
})

我想获取具有以下格式的对象数组:

{
  alias1:value1,
  alias2:value2,
  alias3:value3,
  alias4:value4
}

但是我得到了:

{
  alias1:value1,
  alias2:value2,
  model1.alias3:value3,
  model1.model2.id:rowId,
  model1.model2.alias4:value4
}

我想知道是否有删除“模型”的方法。属性名称的一部分,以及是否有人可以解释我,如果我没有在属性数组中包含Sequelize的原因,为什么Sequelize返回“ rowId”以及如何避免使用它,所以我不必迭代该数组即可我想要的格式。

谢谢

2 个答案:

答案 0 :(得分:1)

经过大量研究,我找到了实现Vivek Doshi仅在根级别定义attributes的想法的正确方法。为此,您需要使用Sequelize.col()函数并传递Sequelize为表创建的别名作为参数,通常类似于table1->table2.attribute。因此,我的示例的工作版本为:

let result= await model.findAll({
  attributes:[
    ['att1', 'alias1'], ['att2', 'alias2'], [Sequelize.col('table1.att3'),
    'alias3'], [Sequelize.col('table1->table2.att4'), 'alias4']],
  include:[{
    model:model1,
    attributes:[],
    include:[{
     model:model2,
     attributes:[]
    }]
  }]
})

答案 1 :(得分:0)

您是否只在根级别尝试过attribute

await model.findAll({
  attributes:[['att1', 'alias1'], ['att2', 'alias2'] , ['model1.att3', 'alias3'] , ['model1.model2.att4', 'alias4']],
  // OR
  // attributes:[['att1', 'alias1'], ['att2', 'alias2'] , ['$table1.att3$', 'alias3'] , ['$table1.table2.att4$', 'alias4']],
  include:[{
    model:model1
    include:[{
      model:model2
    }] 
  }],
  limit:50,
  raw:true
})