Sequelize包括属性而不是节点

时间:2016-10-04 09:42:15

标签: javascript orm sequelize.js

在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'
}

2 个答案:

答案 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
  }]
})