sequelize.js - Sequelize、关系和必需的属性

标签 sequelize.js

我创建了一个示例 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 步:我只是构建用户,知道所有属性都是不可为空的。
  • 第 2 步:调用 setRole() 时。 Sequelize 调用虚假的 INSERT 语句 INSERT INTO 用户 ( role_id , updatedAt , createdAt ) VALUES (1, ... 。大概是为了创建一个具有正确角色 ID 的用户条目。

  • 由于违反了非空约束,这会生成一个异常。
  • 第 3 步:永远不会到达。

  • 如果我更改第 2 步和第 3 步的顺序,它会起作用 - 创建用户条目,然后建立关联。

    但是如果 role_id 也不能为空,我该怎么办?

    然后是一个真正的鸡和蛋的情况。

    我该怎么做才能避免这种情况?我唯一能想到的就是手动设置 role_id ,但这与 ORM 的想法背道而驰。

    最佳答案

    在这里做这个。

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

    关于sequelize.js - Sequelize、关系和必需的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55013207/

    相关文章:

    javascript - Sequelize 模型方法 "this"问题

    database - npx sequelize 生成 :migration --name=[name] keeps failing with Unknown argument: default

    PostgreSQL 如何根据另一个表上的插入对一个表的列进行平均

    javascript - 将sql查询转换为sequelize查询

    node.js - 在单个对象而不是嵌套对象中显示所有数据

    javascript - 如何使用 sequelize 和 sqlite 验证 int 和 boolean

    express - 使用passport-jwt进行身份验证后,对模型属性未定义的Express.js Controller 进行 Sequelize

    javascript - 如何在 Sequelize JS 和 PostgreSQL 中的 1 :M relationship when implementing with . bulkCreate() 中使用外键

    node.js - Sequelize 无法通过网络连接到 SQL Server

    javascript - Sequelize 。如何在创建中使用不同的参数值