Sequelize - 如何让所有地点的所有员工

时间:2018-06-06 17:41:29

标签: mysql node.js sequelize.js

我先说我认为我的模型关联可能不正确

基本上我要做的就是返回公司所有员工的数组。

  • 获取具有相同companyId
  • 的所有位置
  • 使用这些位置,获取与locationId绑定的所有个人资料。

个人资料通过员工链接到地点。

以下是我的代码。

查询:

 Location.findAll({
        where: { companyId: user.profile.companyId },
        include: [
            {
                model: Employee
            }
        ]
    })

这会生成错误"employee is not associated to location!"

我的模特:

Employee.belongsTo(Profile)
Employee.belongsTo(Location)

Profile.belongsTo(Company)
Location.belongsTo(Company)

Profile.belongsToMany(Location, {
    through: Employee,
    foreignKey: "profileId"
})

Location.belongsToMany(Profile, {
    through: Employee,
    foreignKey: "locationId"
})

编辑:

添加Location.hasMany(Employee)允许我进行查询,但是它仍然需要在另一个for循环中使用for循环来获得所需的正确数据结构。

const locations = await models.Location.findAll({
        where: { companyId: user.profile.companyId },
        include: [{ model: models.Profile }]
    })

    const response = []

    locations.forEach(location => {
        location.profiles.forEach(profile => {
            response.push({ location, profile })
        })
    })

    return response

下面的查询将返回完全相同但仅适用于单个位置的查询。我需要运行相同的查询,但需要多个位置。

Employee.findAll({ where: { locationId }, include: [Profile, Location] })

1 个答案:

答案 0 :(得分:1)

您已指定位置属于多个位置,但您未能指定其他方式。您应该指定一个Location hasMany Employees。

指定Employee.belongsTo(Location)可让您将相关位置包含在员工中。指定Location.hasMany(Employee)允许您将相关员工包含在地点中。

我能够重新创建您的问题并使用此行修复它。

Location.hasMany(Employee, {
    //...
})