在Sequelize中,有没有一种正确的方法来使用include进行查询,而不是在节点中显示包含的实体,而是显示包含主模型属性的实体属性?
示例:
// Project belongsTo Customer
Project.findAll({
include: [{
model: Customer
}]
})
实际结果:
{
name: 'Project X',
customer: {
name: 'Customer Y',
street: 'Paddington street'
}
}
预期结果:
{
name: 'Project X',
customer_name: 'Customer Y',
customer_street: 'Paddington street'
}
答案 0 :(得分:1)
我不认为Sequelize可以做到这一点。我建议以这种方式获取结果,然后遍历结果以重命名属性(例如,使用Object.keys):
Project.findAll({
include: [{
model: Customer
}]
}).then(projects => {
return projects.map(project => {
Object.keys(project.customer).forEach(key => {
project['customer_' + key] = project.customer[key];
})
delete project.customer;
return project;
})
})
如果您确实需要直接从数据库获取结果,则最终可以进行原始查询,但是那样您将失去ORM的好处。
答案 1 :(得分:0)
我知道这是一个老问题,但是我有一个类似的问题,并找到了Sequelize解决方案。因此,对于OP的示例,解决方案是这样的:
Project.findAll({
attributes: [
[sequelize.col('Customer.name'), 'customer_name'],
[sequelize.col('Customer.street'), 'customer_street'],
],
include: [{
model: Customer,
attributes: [], // Make sure no nested attributes are returned
}]
})