Создание экземпляра с ассоциацией в Sequelize

Используя Sequelize, я создал две модели: User и Login.

Пользователи могут иметь более одного входа, но логин должен иметь ровно одного пользователя, что означает, что Логин не может быть сохранен без идентификатора пользователя.

Как мне .create a Войти с ассоциацией пользователя одним махом?

Текущий код (не работает)

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

)};

Вышеприведенные результаты в SequelizeValidationError: notNull Violation: UserId cannot be null

Ответ 1

Если у вас есть правильная связь между пользователями и логином, вы можете просто создать пользователя, включая логин:

User.create({
   name: "name",
   Login: {...}
},{
   include: Login
})

Вы можете найти больше информации здесь: http://docs.sequelizejs.com/manual/tutorial/associations.html#creating-with-associations

Ответ 2

Прежде всего вам нужно установить отношения в обоих направлениях, например:

// Set up the models
var User = sequelize.define('User', {});
var Login = sequelize.define('Login', {});

// Set the correct associations
User.hasMany(Login, {})
Login.belongsTo(User, {});

Затем вам нужно правильно получить экземпляры, возвращенные promises:

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

Ответ 3

В вашем .then обратный вызов получает экземпляр модели, созданный предыдущим вызовом. Вам нужно указать аргумент внутри функции обратного вызова.

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

Также что-то важное, что я хотел бы отметить, это ваши отсутствующие инструкции var! Они важны, но не связаны с этим вопросом. См. Объявление переменных без ключевого слова var

Ответ 5

У меня такая же проблема в последнее время! У меня ошибка опечатки с конфигурацией foreignKey. Использование field вместо name вызвало проблему.

Ниже приведенное изменение будет исправлено.

{
    foreignKey: {
       name: 'userId',
       allowNull: false,
    }
}

Ответ 6

В качестве дополнения вы также можете вложить свое творение, чтобы оно было еще более эффективным и лаконичным.

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

как видно здесь: https://github.com/sequelize/sequelize/issues/7252

Ответ 7

У вас есть связь между пользователем и логином с ограничением allowNull на false. Вы должны создать Login перед User или установить для allowNull значение true в модели, а в таблице - DB (ограничение LoginId Null)

var User = sequelize.define('User', {});
var Login = sequelize.define('Login', {});
Login.belongsTo(User, {
  onDelete: 'cascade',
  foreignKey: {
    field: 'userId',
    allowNull: false,
  }
});

Решение

Login.create({
   username: "username",
   User: {...}
},{
   include: User
})