Sequelize を使用して、User
とLogin
の2つのモデルを作成しました。
ユーザーは複数のログインを持つことができますが、ログインにはユーザーが1人だけ必要です。つまり、ユーザーIDなしではログインを保存できません。
どうすれば.create
すべてが一気にユーザーの関連付けでログインしますか?
現在のコード(動作しません)
// 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
ユーザーとログインの間に適切な関連付けがあると仮定すると、ログインを含むユーザーを作成できます。
User.create({
name: "name",
Login: {...}
},{
include: Login
})
詳細はこちらをご覧ください: http://docs.sequelizejs.com/manual/tutorial/associations.html#creating-with-associations
まず、次のように、両方の方法でリレーションを設定する必要があります。
// Set up the models
var User = sequelize.define('User', {});
var Login = sequelize.define('Login', {});
// Set the correct associations
User.hasMany(Login, {})
Login.belongsTo(User, {});
次に、promiseによって返されるインスタンスを適切に取得する必要があります。
// 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
});
あなたの.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キーワードなしで変数を宣言する を参照してください
@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
制約allowNullがfalseのユーザーとログインの間に関連付けがあります。 Userの前にLoginを作成するか、モデルおよびテーブルでallowNullを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
})
追加として、作成物をネストして、さらに効果的かつ簡潔にすることもできます。
// 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
私は最近同じ問題を抱えています! foreignKey configにタイプミスがあります。 field
の代わりにname
を使用すると、問題が発生しました。
以下の変更により修正されます。
{
foreignKey: {
name: 'userId',
allowNull: false,
}
}