序列化关系查询返回重复数据

时间:2018-06-30 22:16:34

标签: javascript node.js sequelize.js

我正在使用Sequelize关系查询指定客户的客户订单。

index.js

var results2 = await customerService.getOrders(1);
console.log(results2);   

service.js

exports.getOrders = function (id) {
    return customerModel.findAll({
        raw: true,
        include: [{
            model: orderModel,
            where: { customer_idcustomer: id }
        }],

    }).then(r => r);
};

结果

[ { idcustomer: 1,
    customername: 'hello world',
    'orders.idorder': 1,
    'orders.orderdesc': 'order description 1',
    'orders.customer_idcustomer': 1 },
  { idcustomer: 1,
    customername: 'hello world',
    'orders.idorder': 2,
    'orders.orderdesc': 'Test 456',
    'orders.customer_idcustomer': 1 },
  { idcustomer: 1,
    customername: 'hello world',
    'orders.idorder': 3,
    'orders.orderdesc': 'Test 123',
    'orders.customer_idcustomer': 1 } ]

预期

[ { idcustomer: 1,
    customername: 'hello world',
    'orders: [{
       'orders.idorder': 1,
       'orders.orderdesc': 'order description 1',
       'orders.customer_idcustomer': 1 },   
    },
    {
       'orders.idorder': 2,
       'orders.orderdesc': 'order description 2',
       'orders.customer_idcustomer': 1 },   
    },
    {
       'orders.idorder': 3,
       'orders.orderdesc': 'order description 3',
       'orders.customer_idcustomer': 1 },   
    }]
]

2 个答案:

答案 0 :(得分:1)

您所需要做的就是从查询

中删除raw: true,

因为它将返回普通对象/平面对象,这将转换您的对象的外观。

exports.getOrders = function (id) {
    return customerModel.findAll({
        // raw: true, // <------ Just remove this line
        include: [{
            model: orderModel,
            where: { customer_idcustomer: id }
        }],

    }).then(r => r);
};

  

注意:您应根据自己的位置将where条件放在较高的位置   逻辑

exports.getOrders = function (id) {
    return customerModel.findAll({
        where: { id: id } ,
        // raw: true, // <------ Just remove this line
        include: [{
            model: orderModel
        }]
    }).then(r => r);
};

答案 1 :(得分:0)

尝试从查询中删除raw键值。

  

Finder方法用于从数据库查询数据。他们是这样   不返回普通对象,而是返回模型实例。因为   finder方法返回模型实例,您可以调用任何模型实例   实例文档中所述的结果成员。

如果要获取没有元数据/模型信息的数据,请使用

映射结果
{ plain: true }

docs

中有很好的续集示例

示例:

const getPlainData = records => records.map(record =>
  record.get({ plain: true }));

// Your code
return customerModel.findAll({
        // raw: true, <= remove
        include: [{
            model: orderModel,
            where: { customer_idcustomer: id }
        }],

    }).then(getPlainData);