En utilisant Sequelize , j'ai créé deux modèles: User
et Login
.
Les utilisateurs peuvent avoir plusieurs connexions, mais une connexion doit avoir exactement un utilisateur, ce qui signifie qu'une connexion ne peut pas être enregistrée sans un ID utilisateur.
Comment puis-je .create
une connexion avec une association d'utilisateurs en un seul coup?
Code actuel (ne fonctionne pas)
// Set up the models
var User = sequelize.define('User', {});
var Login = sequelize.define('Login', {});
Login.belongsTo(User, {
onDelete: 'cascade',
foreignKey: {
field: 'userId',
allowNull: false,
}
});
// Create the instances
var user = User.create().then(function() {
// THIS IS WHERE I WOULD LIKE TO SET THE ASSOCIATION
var login = Login.create({
userId: user.get('id')
});
)};
Les résultats ci-dessus dans SequelizeValidationError: notNull Violation: UserId cannot be null
En supposant que vous ayez la bonne association entre les utilisateurs et la connexion, vous pouvez simplement créer un utilisateur comprenant une connexion:
User.create({
name: "name",
Login: {...}
},{
include: Login
})
vous pouvez trouver plus d'informations ici: http://docs.sequelizejs.com/manual/tutorial/associations.html#creating-with-associations
Tout d'abord, vous devez configurer les relations dans les deux sens, comme ceci:
// Set up the models
var User = sequelize.define('User', {});
var Login = sequelize.define('Login', {});
// Set the correct associations
User.hasMany(Login, {})
Login.belongsTo(User, {});
Ensuite, vous devez obtenir correctement les instances renvoyées par les promesses:
// Create the instances
User.create({}).then(function(newUser) {
// now you can use newUser acessors to create the login
return newUser.createLogin({});
).then(function(newLogin){
// newLogin
}).catch(function(error){
// error
});
Dans votre .then
, le rappel reçoit l'instance de modèle créée par l'appel précédent. Vous devez spécifier l'argument à l'intérieur de la fonction de rappel.
var user = User.create().then(function(user) {
// THIS IS WHERE I WOULD LIKE TO SET THE ASSOCIATION
var login = Login.create({
userId: user.get('id')
});
return login
}).then(function(login) {
// all creation are complete. do something.
});
Je voudrais également souligner quelque chose d'important: vos instructions var
manquantes! Celles-ci sont importantes mais sans rapport avec cette question. Voir Déclaration de variables sans mot-clé var
Une mise à jour de la réponse de @Arwed Mett
//Create Association Alias or just setting association alias by using 'as' keyword will also work
Login.User = Login.belongsTo(User);
User.create({
name: "name",
Login: {...}
}, {
include: [{
association: Login.User
}]
});
Lien de réfraction - http://docs.sequelizejs.com/manual/tutorial/associations.html#creating-with-associations
Vous avez une association entre l'utilisateur et la connexion avec la contrainte allowNull à false. Vous devez créer une connexion avant l'utilisateur ou définir allowNull à true dans le modèle et la table sur DB (contrainte LoginId Null)
var User = sequelize.define('User', {});
var Login = sequelize.define('Login', {});
Login.belongsTo(User, {
onDelete: 'cascade',
foreignKey: {
field: 'userId',
allowNull: false,
}
});
Solution
Login.create({
username: "username",
User: {...}
},{
include: User
})
En plus, vous pouvez également imbriquer votre création pour être encore plus efficace et concis.
// Set up the models
var User = sequelize.define('User', {});
var Login = sequelize.define('Login', {});
...
User.create({
name: "name",
Login:
{
users: {..i.e several users if a user belongs to another user..}
}
},{
include:{
model: Login,
include: User //nested model.Create
}
})
comme on le voit ici: https://github.com/sequelize/sequelize/issues/7252
J'ai le même problème récemment! J'ai une erreur de frappe avec la configuration de ForeignKey. Utiliser field
au lieu de name
a provoqué le problème.
Le changement ci-dessous le corrigera.
{
foreignKey: {
name: 'userId',
allowNull: false,
}
}