У меня есть отношение 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?Заранее спасибо за помощь.