首页 文章

在Sequelize中使用关联创建实例

提问于
浏览
17

使用Sequelize,我创建了两个模型: UserLogin .

用户可以有多个登录,但登录必须只有一个用户,这意味着没有用户ID就无法保存登录 .

如何 .create a一次性登录用户关联?

Current Code (Doesn't Work)

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

7 回答

  • 6

    假设您在用户和登录之间拥有正确的关联,您可以创建一个包含登录的用户:

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

    你可以在这里找到更多信息:http://docs.sequelizejs.com/manual/tutorial/associations.html#creating-with-associations

  • 0

    首先,您需要以两种方式设置关系,如下所示:

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

    .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 陈述!这些很重要,但与这个问题无关 . 见Declaring variables without var keyword

  • 51

    更新@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

  • 1

    用户登录与约束allowNull之间的关联为false . 您必须在User之前创建Login或在模型中将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
    })
    
  • 0

    我最近有同样的问题!我有一个使用foreignKey配置的拼写错误 . 使用 field 而不是 name 导致问题 .

    下面的更改将解决它 .

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

    另外,您还可以将您的创作嵌套为更加有效和简洁 .

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

相关问题