web-dev-qa-db-ja.com

Sequelizeで関連付けを持つインスタンスを作成する

Sequelize を使用して、UserLoginの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

22
slifty

ユーザーとログインの間に適切な関連付けがあると仮定すると、ログインを含むユーザーを作成できます。

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

詳細はこちらをご覧ください: http://docs.sequelizejs.com/manual/tutorial/associations.html#creating-with-associations

56
Arwed Mett

まず、次のように、両方の方法でリレーションを設定する必要があります。

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

あなたの.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キーワードなしで変数を宣言する を参照してください

6
Calvintwr

@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

4
Kshateesh

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

追加として、作成物をネストして、さらに効果的かつ簡潔にすることもできます。

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

0
iwaduarte

私は最近同じ問題を抱えています! foreignKey configにタイプミスがあります。 fieldの代わりにnameを使用すると、問題が発生しました。

以下の変更により修正されます。

{
    foreignKey: {
       name: 'userId',
       allowNull: false,
    }
}
0
Quy Tang