序列化,关系和所需属性

时间:2019-03-05 23:26:48

标签: sequelize.js

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

一个角色可以有很多用户。

角色模型:

"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

用法

现在,我尝试创建一个角色和一个用户并将其关联

INSERT INTO
  • 步骤1:我只是构建用户,知道所有属性都是不可为空的。

  • 步骤2:调用setRole()时。 Sequelize调用伪造的INSERT语句(用户, role_id , updatedAt ) VALUES (1, ... createdAt {{1}}。大概是为了创建一个具有正确角色ID的用户条目。

由于违反了非null约束,因此会生成一个异常。

  • 第3步:永远不会到达。

如果我更改第2步和第3步的顺序,则可以正常工作-创建用户条目,然后进行关联。

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

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

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

1 个答案:

答案 0 :(得分:0)

在这里做

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