2017-08-31 67 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); 
    }); 
});