2017-08-31 28 views
2

従業員およびオフィスの2つのモデルがあります。すべての従業員は1つのオフィスに属し、1つのオフィスには多くの従業員があります。Sequelizeの関連付け値

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

次のようにオフィスモデルは次のとおりです。

{ 
    "id": "2", 
    "name" : "John", 
    "office": { 
     "id": 2, 
     "name" : "Seattle" 
    } 
} 
:私は以下の従業員を持っているデータベースで

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

.. 。そして、次のオフィス:私は(1)のオフィス2'Seattle')から1'Chicago')に従業員のIDを変更したい

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

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

それは、実際には、まったく何もしません:エラーなしに、DBの問題は、次のクエリ

// 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) 
      }) 

     }) 
    }) 
}) 

で...私の従業員のオフィスが更新されないということです変更されません。私は、私が正しくやっていないことが疑わしいが、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); 
    }); 
}); 
関連する問題