Sequelize BelongsToMany установил foreignKey в качестве primaryKey - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть отношение N: M между пользователем и ролью, также у меня есть ассоциация с именем UserRole, где я храню несколько атрибутов и два иностранных ключа: user_id и role_id.Моя цель - установить user_id в UserRole в качестве основного.

Модель пользователя:

module.exports = (sequelize, DataTypes) => {
    const User = sequelize.define('User', {
        // attributes
    }, {
        underscored: true,
        hooks: {
           beforeCreate: hashPassword,
           beforeUpdate: hashPassword
        }
    })

    User.associate = ({User, Role, UserRole}) => {
        User.belongsToMany(Role, {
            through: UserRole, 
            foreignKey: {
                name: 'user_id',
                allowNull: false
            }
        })
    }

    return User
}

Ролевая модель:

module.exports = (sequelize, DataTypes) => {
    const Role = sequelize.define('Role', {
        // attributes
    }, {
        underscored: true
    })

    Role.associate = ({Role, User, UserRole}) => {
        Role.belongsToMany(User, {
            through: UserRole, 
            foreignKey: {
                name: 'role_id',
                allowNull: false
            }
        })
    }

    return Role
}

Модель UserRole:

module.exports = (sequelize, DataTypes) => {
    const UserRole = sequelize.define('UserRole', {
        id: {
            type: DataTypes.INTEGER,
            allowNull: false,
            autoIncrement: true,
            unique: true,
            primaryKey: true
        },
        // rest of attributes
     }, {
         underscored: true
     })

    return UserRole
}

Если я установлю это, как указано выше, я получу таблицу UserRole с таким кодом:

CREATE TABLE IF NOT EXISTS "UserRoles" (
    "id"   SERIAL UNIQUE , 
    "is_valid" BOOLEAN NOT NULL DEFAULT true,
    "assigned_at" TIMESTAMP WITH TIME ZONE NOT NULL,
    "revoked_at" TIMESTAMP WITH TIME ZONE,
    "created_at" TIMESTAMP WITH TIME ZONE NOT NULL,
    "updated_at" TIMESTAMP WITH TIME ZONE NOT NULL,
    "user_id" INTEGER NOT NULL REFERENCES "Users" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
    "role_id" INTEGER NOT NULL REFERENCES "Roles" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
    UNIQUE ("user_id", "role_id"), PRIMARY KEY ("id")
);

Но это не моя цель.Я попытался удалить атрибут id в UserRole модели и установить его в User модели:

User.belongsToMany(Role, {
    through: UserRole, 
    foreignKey: {
        name: 'user_id',
        allowNull: false,
        primaryKey: true
    }
})

Но затем я получил и user_id и role_id как PK.Есть ли возможность установить только один из внешних ключей в качестве идентификатора первичного ключа?Или, может быть, я не правильно понял ассоциации N: M?Заранее спасибо за помощь.

...