web-dev-qa-db-fra.com

Création d'une instance avec une association dans Sequelize

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

22
slifty

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

56
Arwed Mett

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

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

6
Calvintwr

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

4
Kshateesh

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
})
1
Achille Skineur

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

0
iwaduarte

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,
    }
}
0
Quy Tang