Sequelize.js Sequelize、关系和所需属性

Sequelize.js Sequelize、关系和所需属性,sequelize.js,Sequelize.js,我创建了一个示例Express/Sequelize/sqlite应用程序,在关联模型时遇到了一个奇怪的问题。我的模式如下: 一个角色可以有多个用户 榜样: module.exports = (sequelize, DataTypes) => { const Role = sequelize.define("Role", { name: { type: DataTypes.STRING, allowNull: false }, shortN

我创建了一个示例Express/Sequelize/sqlite应用程序,在关联模型时遇到了一个奇怪的问题。我的模式如下:

一个角色可以有多个用户

榜样:

module.exports = (sequelize, DataTypes) => {
  const Role = sequelize.define("Role", {
    name: {
      type: DataTypes.STRING,
      allowNull: false
    },
    shortName: {
      type: DataTypes.STRING,
      allowNull: false
    }
  });
  Role.associate = function(models) {
    // associations can be defined here
    Role.hasMany(models.User, {
      as: "Users",
      foreignKey: "role_id",
      sourceKey: "id"
    });
  };
  return Role;
};
用户模型

"use strict";
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define("User", {
    firstName: {
      type: DataTypes.STRING,
      allowNull: false
    },
    lastName: {
      type: DataTypes.STRING,
      allowNull: false
    },
    email: {
      type: DataTypes.STRING,
      allowNull: false
    },
    username: {
      type: DataTypes.STRING,
      allowNull: false
    },
    password: DataTypes.STRING
  });
  User.associate = function(models) {
    // associations can be defined here
    User.belongsTo(models.Role, {
      as: "Role",
      foreignKey: "role_id",
      targetKey: "id"
    });
  };
  return User;
};
用法

现在我尝试创建一个角色和一个用户,并将它们关联起来

let adminRole = await models.Role.create({
        name: "Admin",
        shortName: "A"
      });

let john = await models.User.build({ // Step 1
             firstName: "John",
             lastName: "Doe",
             email: "John@doe.com",
             username: "john",
             password: "this_should_be_encypted"
           });

await john.setRole(adminRole); // Step 2
await john.save();             // Step 3
  • 步骤1:我只是构建用户,知道所有属性都不可为null

  • 步骤2:调用setRole()时。Sequelize调用一个伪INSERT语句
    INSERT INTO
    用户
    role\u id
    updatedAt
    createdAt
    )值(1,…
    ),大概是为了创建一个具有正确角色id的用户条目

这会生成一个异常,因为违反了非null约束

  • 第三步:永远无法到达
如果我更改步骤2和步骤3的顺序,它会工作-创建用户条目,然后建立关联

但如果role_id也不可为空,我该怎么办

然后是真正的鸡和蛋的情况

我能做些什么来避免这种情况?我唯一能想到的是手动设置角色id,但这与ORM的想法背道而驰。

在这里这样做

await john.setRole(adminRole, {save: false}); // Step 2
await john.save();             // Step 3

非常感谢,这完全解决了我的问题。还有一个问题,从哪里可以获得这些信息?也许我太懒了,但我在官方文档中没有找到。是的,维护文档的人也很懒,哈哈。你可以在sequelize github的问题部分找到这方面的提及。比如