2017-08-31 64 views
2

我有两种型号,员工 s和办公室 s。每个员工属于一个办公室,办公室有许多员工。续集相关值

我很难搞清楚如何使用Sequelize更新员工的办公室。

员工模型如下:

let Employee = sequelize.define("Employee", { 
    id: { 
     field: 'id', 
     type: DataTypes.INTEGER, 
     primaryKey: true, 
     allowNull: false, 
     autoIncrement: false 
    }, 
    name: { 
     field: 'name', 
     type: DataTypes.STRING(255), 
     allowNull: false 
    } 
}, { 
    freezeTableName: true, 
    timestamps: false, 
    deletedAt: false 
}) 

Employee.associate = models => { 
    Employee.belongsTo(models.Office, { 
     foreignKey: 'id' 
    }) 
} 

办公室模型如下:

let Office = sequelize.define("Office", { 
    id: { 
     field: 'id', 
     type: DataTypes.INTEGER, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    name: { 
     field: 'name', 
     type: DataTypes.STRING(255), 
     allowNull: false 
    } 
}, { 
    freezeTableName: true, 
    tableName: 'Lkup_Office', 
    timestamps: false, 
    deletedAt: false 
}) 
Office.associate = models => { 
    Office.hasMany(models.Employee, { 
     foreignKey: 'id' 
    }) 
} 

在我有以下员工数据库:

{ 
    "id": "2", 
    "name" : "John", 
    "office": { 
     "id": 2, 
     "name" : "Seattle" 
    } 
} 

..以及下面的办公室:

[ 
    { 
     "id": 1, 
     "name" : "Chicago" 
    }, 
    { 
     "id": 2, 
     "name" : "Seattle" 
    } 
] 

欲雇员的ID改变(1)的办公室从2'Seattle')到1'Chicago');问题是,用下面的查询

// PUT /2/office/1 

router.put('/:employeeId/office/:officeId', (req, res) => { 
    models.Employee.findOne({ 
     where:{id:req.params.employeeId}, 
     include:[{model:models.Office}] 
    }).then(employee => { 

     models.Office.findOne({ 
      where:{id:req.params.officeId}, 
      include:[{model:models.Employee}] 
     }).then(office => { 

      employee.setOffice(office).then(result => { 
       res.send(result) 
      }) 

     }) 
    }) 
}) 

...我的员工的办公室,不更新:

{ 
    "id": "2", 
    "name" : "John" 
    "office": { 
     "id": 2 
     "name" : "Seattle" 
    } 
} 

它不,其实,做任何事情:没有错误,数据库没有改变。我怀疑有些事情我做得不对,但Sequelize并没有抛出任何错误。

回答

0
router.put('/:employeeId/office/:officeId', (req, res) => { 

    /*In this first part, I just separated the two queries into two 
     separate variables*/ 

    let employeeInfo = models.Employee.findOne({ 
     where: { 
      id: req.params.employeeId 
     }, 
     include: [{ 
      model: models.Office 
     }] 
    }); 

    let officeInfo = models.Office.findOne({ 
     where: { 
      id: req.params.officeId 
     }, 
     include: [{ 
      model: models.Employee 
     }] 
    }); 

    /*In this next part, we have to use Promise.all, which comes with 
     bluebird, which is already a part of Sequelize.js. How this next 
     part is executed will depend on how you have your Sequelize.js code 
     structured in your application. This may require some trial and error*/ 

    models.sequelize.Promise.all([employeeInfo, officeInfo]).then(([Employee, Office])=> { 
     return Employee.setOffice(Office); 
    }).catch(err => { 
     console.log(err); 
    }); 
});