2017-08-31 3 views
2

J'ai deux modèles, Employé s et Bureau s. Chaque employé appartient à un bureau et un bureau compte plusieurs employés.Sequelize set valeur associée

Je n'arrive pas à trouver comment mettre à jour le bureau d'un employé en utilisant Sequelize.

Le employé modèle est la suivante:

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

Le modèle Office est la suivante:

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

Dans la base de données que j'ai l'employé qui suit:

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

.. . et les bureaux suivants:

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

Je souhaite modifier l'ID du bureau de l'employé (1) de 2 ('Seattle') à 1 ('Chicago'); le problème est que la requête suivante

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

     }) 
    }) 
}) 

... bureau de mon employé n'est pas mis à jour:

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

Il n'a pas, en fait, rien faire du tout: pas d'erreur, le DB n'est pas changé. Je soupçonne qu'il y a quelque chose que je ne fais pas correctement, mais Sequelize ne lance aucune erreur.

Répondre

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