Sequelize 关系查询返回重复数据

2022-01-19 00:00:00 node.js javascript sequelize.js

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

index.js

var results2 = await customerService.getOrders(1);控制台.log(结果2);

service.js

exports.getOrders = function (id) {返回 customerModel.findAll({生:真的,包括: [{型号:订单型号,其中:{ customer_idcustomer:id }}],}).then(r => r);};

结果

[ { idcustomer: 1,客户名称:'你好世界','orders.idorder': 1,'orders.orderdesc': '订单描述 1','orders.customer_idcustomer': 1 },{ id客户:1,客户名称:'你好世界','orders.idorder': 2,'orders.orderdesc': '测试 456','orders.customer_idcustomer': 1 },{ id客户:1,客户名称:'你好世界','orders.idorder': 3,'orders.orderdesc': '测试 123','orders.customer_idcustomer': 1 } ]

预期

[ { idcustomer: 1,客户名称:'你好世界','命令: [{'orders.idorder': 1,'orders.orderdesc': '订单描述 1','orders.customer_idcustomer': 1 },},{'orders.idorder': 2,'orders.orderdesc': '订单描述 2','orders.customer_idcustomer': 1 },},{'orders.idorder': 3,'orders.orderdesc': '订单描述 3','orders.customer_idcustomer': 1 },}]]

解决方案

你只需要从查询中删除 raw: true,

因为它将返回普通/平面对象,这会将您的对象转换为现在的样子.

exports.getOrders = function (id) {返回 customerModel.findAll({//raw: true,//<------ 删除这一行包括: [{型号:订单型号,其中:{ customer_idcustomer:id }}],}).then(r => r);};

<小时><块引用>

注意:您应该根据您的要求将 where 条件放在上层逻辑

exports.getOrders = function (id) {返回 customerModel.findAll({其中: { id: id } ,//raw: true,//<------ 删除这一行包括: [{型号:订单型号}]}).then(r => r);};

I'm querying customer orders for a specified customer using Sequelize relationships.

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);
};

results

[ { 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 } ]

expected

[ { 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 },   
    }]
]

解决方案

All you need is to remove raw: true, from query ,

as it will return plain/flat object , and that will convert your object as it looks now.

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

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


Note : You should put the where condition in upper level as per your logic

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

相关文章