首页 文章

Sequelize在查询中返回连接表

提问于
浏览
4

我在这两个模型之间的MSQL表中有多对多的关系:

场地 - 代表可以拥有多个所有者(员工)的场所员工 - 代表可以是首席执行官或销售员工或任何人的员工 .

我正在使用sequelize来 Build 这样的关系:

关系员工>地点

Employee.associate = function (models) { 
   models.Employee.belongsToMany(models.Venue, { through: 'EmployeeVenues' })
 }

关系地点>员工

Venue.associate = function (models) {
    models.Venue.belongsToMany(models.Employee, { through: 'EmployeeVenues' })
 }

Sequelize docs

根据Sequelize文档,它将创建一个名为EmployeeVenues的新模型,其中包含等效的外键employee_id和venue_id . 需要定义 . Sequelize之前会尝试自动生成名称,但这并不总能导致最合理的设置 . 这会将方法getVenues,setVenues,addVenue,addUsers添加到Employee中 .


这是正确的工作,当我启动我的Sequelize时,它会创建一个名为EmpoyeeVenues的新表,并使用正确的外键作为复合键 . 但是,当我查询getVenues时,它不会返回预期的输出 . 相反,它也返回相关的表值,这是我不想要的 .


查询以获取属于id等于1的员工的所有场所


router.get('/api/v1/users/:employee_id/venues', (request, response) => {
  var employeeId = request.params.employee_id;

  models.Employee.findOne({
    where: {id: employeeId}
  }).then((employee) => {

    if(!employee) { return response.status(400).send("Employee doesnt have a venue registered yet.")}
    var venues = employee.getVenues().then((venues) => {
    response.status(200).send(venues);
  })
})
});

响应结果


[
    {
        "id": 1,
        "capacity": "11",
        "venue_name": "Club Fix",
        "venue_description": "Club in Tilburg",
        "EmployeeVenues": {
            "employee_id": 1,
            "venue_id": 1
        }
    },
    {
        "id": 2,
        "capacity": "400",
        "venue_name": "Club Vie",
        "venue_description": "Club in Rotterdam",
        "EmployeeVenues": {
            "employee_id": 1,
            "venue_id": 2
        }
    }
]

问题

为什么Sequelize提供的此查询中包含EmployeeVenues?如何防止EmployeeVenues包含在响应中?

更新

根据2014年制作的Sequelize github页面上的一个问题,有一个有效的解决方案

https://github.com/sequelize/sequelize/issues/2143

User.find({
    where: {id: userId}, attributes: userFields,
    include: [
      {model: db.Role, attributes: roleFields, through: {attributes: []}}
    ]
});

但它与Sequelize文档中的文档版本不匹配,该文档是最新的,至少它应该是 .


User.findAll({
  include: [{
    model: Project,
    through: {
      attributes: ['createdAt', 'startedAt', 'finishedAt'],
      where: {completed: true}
    }
  }]
});

或者甚至在reference documentation:上简单说明


user.getPictures() // gets you all pictures

1 回答

  • 1

    更新

    根据2014年制作的Sequelize github页面上的一个问题,有一个有效的解决方案

    https://github.com/sequelize/sequelize/issues/2143

    User.find({
        where: {id: userId}, attributes: userFields,
        include: [
          {model: db.Role, attributes: roleFields, through: {attributes: []}}
        ]
    });
    

    但它与Sequelize文档中的文档版本不匹配,该文档是最新的,至少它应该是 .


    User.findAll({
      include: [{
        model: Project,
        through: {
          attributes: ['createdAt', 'startedAt', 'finishedAt'],
          where: {completed: true}
        }
      }]
    });
    

    或者甚至在reference documentation:上简单说明


    user.getPictures() // gets you all pictures
    

相关问题