Sequelize внешний ключ с ассоциацией - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть база данных, созданная с помощью 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 не генерируется как внешний ключ в моей пользовательской таблице. Также, пожалуйста, убедитесь, что отношения, которые здесь упоминаются (один ко многим), правильные или нет.

Пожалуйста, проверьте мой код и дайте мне какие-либо предложения, если потребуются какие-либо изменения. Я новичок в разработке

1 Ответ

0 голосов
/ 19 апреля 2020

Ваша user миграция также должна знать о внешнем ключе; Вы делаете это, добавляя ключ references: к определению столбца. Документация Sequelize содержит пример внешнего ключа; прокрутите примерно половину страницы вниз (или просто найдите 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
}
...