【问题标题】:Sequelize foreign key with associationSequelize 与关联的外键
【发布时间】:2020-04-20 07:34:00
【问题描述】:

我有一个使用 Postgres 创建的数据库,它是为单个外键关联设置的,现在,这将被映射为角色表模型 考虑我有两个表用户和角色 角色包含角色详细信息,用户包含角色的用户详细信息

   const uuid = require('uuid/v4');
            ('use strict');
            module.exports = (sequelize, DataTypes) => {
              const role = sequelize.define(
                'role',
                {
                  id: {
                    allowNull: false,
                    primaryKey: true,
                    type: DataTypes.UUID,
                  },

                  name: {
                    type: DataTypes.STRING,
                    allowNull: false,
                  },
                },
                {}
              );
              role.beforeCreate((role) => (role.id = uuid()));
              role.associate = function (models) {
                role.hasMany(models.user), { foreignKey: 'roleId', as: 'user_roleId' };
              };
              return role;
            };

    role migration 

    'use strict';
    module.exports = {
      up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('roles', {
          id: {
            allowNull: false,
            primaryKey: true,
            type: Sequelize.UUID,
          },
          name: {
            type: Sequelize.STRING,
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
        });
      },
      down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable('roles');
      },
    };

    user model

    const uuid = require('uuid/v4');
    ('use strict');
    module.exports = (sequelize, DataTypes) => {
      const user = sequelize.define(
        'user',
        {
          id: {
            allowNull: false,
            primaryKey: true,
            type: DataTypes.UUID,
          },

          firstName: {
            type: DataTypes.STRING,
            allowNull: false,
          },
          lastName: DataTypes.STRING,
          email: {
            type: DataTypes.STRING,
            allowNull: false,
          },
          password: {
            type: DataTypes.STRING,
            allowNull: false,
          },

          phoneNumber: {
            type: DataTypes.STRING,
          },
          roleId: {
            type: DataTypes.UUID,
          },
        },
        {
          timestamps: true,
          paranoid: true,
          defaultScope: {
            attributes: { exclude: ['password'] },
          },
        }
      );
      user.beforeCreate((user) => (user.id = uuid()));
      user.associate = function (models) {
        user.belongsTo(models.role, { foreignKey: 'roleId', onDelete: 'CASCADE' });
      };
      return user;
    };

    user migration
    'use strict';
    module.exports = {
      up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('users', {
          id: {
            allowNull: false,
            primaryKey: true,
            type: Sequelize.UUID,
          },
          firstName: {
            type: Sequelize.STRING,
          },
          lastName: {
            type: Sequelize.STRING,
          },
          email: {
            type: Sequelize.STRING,
          },
          password: {
            type: Sequelize.STRING,
          },
          phoneNumber: {
            type: Sequelize.STRING,
          },
          roleId: {
            type: Sequelize.UUID,
          },

          createdAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
          deletedAt: {
            allowNull: true,
            type: Sequelize.DATE,
          },
        });
      },
      down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable('users');
      },
    };

运行迁移后,这些表在我的数据库中创建。role_id 也存在于用户表中。但在我的用户表中,role_id 不会作为外键生成。还请验证这里提到的关系(一对多)是否正确。

请验证我的代码,如果需要任何更改,请给我任何建议。我是开发新手

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    你的user迁移也需要知道外键;为此,您可以在列定义中添加一个 references: 键。 Sequelize documentation 有一个外键示例;向下滚动页面大约一半(或只搜索references)。

    在您的情况下,用户迁移应该类似于:

    module.exports = {
      up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('users', {
          // ... other fields omitted
          roleId: {
            type: Sequelize.UUID,
            references: {
              model: { tableName: 'role' }
              key: 'id',
            },
          },
          // ... more fields omitted
        });
      },
      // down: omitted
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-24
      • 2018-08-21
      • 2021-07-25
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多