Продолжение: возможность создания даже внешнего ключа удаляется (параноидальный тип)

#node.js #foreign-keys #sequelize.js

#node.js #внешние ключи #sequelize.js

Вопрос:

Описание проблемы

Я создал 2 таблицы, user и role . Одно из полей в user том roleId , что указывает на role таблицу. Обе таблицы paranoid равны true . Если role.id 2 удалено [paranoid] ( deletedAt имеет значение), я все равно могу вставить roleId: 2 в user таблицу. [ОБНОВЛЕНИЕ]: даже models.update может обновляться roleId: 2 тоже

Файлы

UserModel.js

 class User extends Model {}

User.init({
  username: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true,
  }
}, {
  sequelize,
  tableName: 'user',
  timestamps: true,
  paranoid: true
})

export default User
 

RoleModel.js

 class Role extends Model {}

Role.init({
  name: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true
  },
}, {
  sequelize,
  tableName: 'role',
  timestamps: true,
  paranoid: true
})

export default Role
 

index.js

 import RoleModel from './RoleModel'
import UserModel from './UserModel'

RoleModel.hasOne(UserModel, {
  foreignKey: {
    name: 'roleId',
    fieldName: 'id',
    allowNull: true
  }
})
UserModel.belongsTo(RoleModel, {
  as: 'role'
})

export {
  RoleModel,
  UserModel
}
 

Окружающая среда

  • Версия продолжения: 6.3.5
  • Node.js версия: v12.18.0
  • Операционная система: macOS
  • диалекты: mysql

Ответ №1:

Конечно, вы можете указать идентификатор записи с программным удалением, потому что эта запись все еще существует в БД, и вы можете получить пользователя с этой ролью, если вы укажете paranoid: false при получении пользователя вместе с ролью:

 const user = User.findById(userId, {
  paranoid: false,
  include: [Role]
}