Создание экземпляра с ассоциацией в 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
Ответ 4
Обновление ответа @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
}]
});
Ссылка на ссылку - http://docs.sequelizejs.com/manual/tutorial/associations.html#creating-with-associations
Ответ 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
})