Таблица "многие ко многим" с несколькими строками с идентичными парами внешних ключей, которые можно добавить только один раз. - PullRequest
0 голосов
/ 18 июня 2020

Я использую диалект mysql с sequelize-v6

У меня две таблицы

class Role extends Model {}

Role.init({
        id: {
            type: DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: DataTypes.STRING,
            allowNull: false
        }
    },
    {
        ...
    });

и

class Employee extends Model {}
Employee.init({
        id: {
            type: DataTypes.STRING,
            primaryKey: true,

        },
        ...

    },

    {
        ...
    });

, и я подключаю их, используя :

class EmployeeRole extends Model {
}

EmployeeRole.init({
        id: {
            type: DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        targetId: {
            type: DataTypes.STRING,
            allowNull: false,
            defaultValue: ''
        }
    },
    {
        ...
    });

Отношения следующие:

RoleModel.belongsToMany(EmployeeModel, {
        as: 'Employees',
        through: EmployeeRoleModel,
        foreignKey: {
            name: 'roleId', allowNull: false
        },
        otherKey: {
            name: 'employeeId',
            allowNull: false
        }
    });
EmployeeModel.belongsToMany(RoleModel, {
        as: 'Roles',
        through: EmployeeRoleModel,
        foreignKey: {
            name: 'employeeId',
            allowNull: false
        },
        otherKey: {
            name: 'roleId',
            allowNull: false
        }
    });

Проблема:

Сотрудник может иметь такой же roleId , следовательно тот же employeeId , но с другим resourceId , и всякий раз, когда я пытаюсь добавить другую сущность, она перезаписывает предыдущую

, например:

{ roleId: 2, employeeId: '#33', resourceId: 'profiles' }
{ roleId: 2, employeeId: '#33', resourceId: 'screenshots' }

Ожидаемый вывод, они оба добавляются в базу данных

Фактический вывод, добавлен только последний, и он перезаписывает предыдущий

для реализации logi c:

const employeeRole = await RoleModel.findByPk(3);
const promise = await employee.addRole(employeeRole, {through: { targetId: 'whatever' }})
    .then(role=>role)
    .catch(_=>null);

// If there is a previous one it will overwrite

# Edit

Я потратил много времени на поиск, но не получил результата.

Я также видел эту проблему на github, которая вроде как,

Многие-ко-многим "через" ...

1 Ответ

0 голосов
/ 19 июня 2020

Попробовав много способов, и спасибо за ShGKme за его комментарий

Я решил эту проблему, создав два 1: M отношения:

EmployeeModel.hasMany(EmployeeRoleModel, {
        as: 'EmployeeRoles',
        foreignKey: {
            name: 'employeeId',
            allowNull: false
        }
    });

RoleModel.hasMany(EmployeeRoleModel, {
        as: 'EmployeeRoles',
        foreignKey: {
            name: 'roleId',
            allowNull: false
        }
    });
...