Using sequelize with expressjs, strangely sequelize return single record instead more than one. There are many records are inserted in shipping_addresses table against a single user. I don't want to remove raw:true it's because that result belongs to graphql that's why using raw:true,
shipping_addresses.belongsTo(users, { as: "userId", foreignKey: "userId"});
users.hasMany(shipping_addresses, { as: "shipping_addresses", foreignKey: "userId"});
sequelize.users.findOne({
where:{...},
include: [model:shipping_addresses, as:'shipping_addresses'],
raw:true,
nest:true
}).
Here is result
{
id:1,
username:johndeo
shipping_addresses: {
id:1
line:abc street
}
}
What I am expecting
{
id:1,
username:johndeo
shipping_addresses: [
{
id:1
line:abc street
},
{
id:2
line:another street
},
]
}
https://sequelize.org/api/v6/class/src/model.js~Model.html#instance-method-get
You don't need raw: true
option. Instead, call get({plain: true})
Sample Code
async function test() {
const row = await Users.findOne({
attributes: ['id', 'username'],
where: { id: 1 },
include: [{ model: ShippingAddresses, attributes: ['id', 'line'], as: 'shipping_addresses' }],
nest: true
});
console.log(row.get({ plain: true }))
}
test()
Result
$ node test
{"pid":25056,"sql":"Executing (default): SELECT \"users\".\"id\", \"users\".\"username\", \"shipping_addresses\".\"id\" AS \"shipping_addresses.id\", \"shipping_addresses\".\"line\" AS \"shipping_addresses.line\" FROM \"users\" AS \"users\" LEFT OUTER JOIN \"shipping_addresses\" AS \"shipping_addresses\" ON \"users\".\"id\" = \"shipping_addresses\".\"user_id\" WHERE \"users\".\"id\" = 1;"}
{
id: 1,
username: 'johndeo',
shipping_addresses: [ { id: 1, line: 'abc street' }, { id: 2, line: 'another street' } ]
}