Sequelize,外键作为复合主键 [英] Sequelize, foreign keys as composite primary key
问题描述
是否可以定义两个外键作为模型的复合主键?
一个用户只能是一个家庭的成员,一个家庭可以有多个成员,family-members表需要用户和家庭的引用
const User = sequelize.define('用户',{id: { type: dataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true },名称:{ 类型:dataTypes.STRING(30) },电子邮件:{ 类型:dataTypes.STRING(30) }...},{类方法:{助理(模特){User.hasOne(models.FamilyMember, {外键:'user_id'}}}})const Family = sequelize.define('家庭',{名称:{ 类型:dataTypes.STRING(30)}},{类方法:{助理(模特){Family.hasMany(models.FamilyMember, {外键:'family_id'}}}})const FamilyMember = sequelize.define('家庭成员',{名称:{ 类型:dataTypes.STRING(30) },/*family_id 和 user_id 将在关联后出现,但我希望它们成为复合主键*/})
其实我几乎是从文档中得到了解决方案:
User = sequelize.define('user', {});Project = sequelize.define('project', {});UserProjects = sequelize.define('userProjects', {状态:DataTypes.STRING});User.belongsToMany(Project, { through: UserProjects });Project.belongsToMany(User, { through: UserProjects });
<块引用>
默认情况下,上面的代码会在UserProjects表中添加projectId和userId,并去掉任何之前定义的主键属性——该表将通过两个表的键的组合来唯一标识,没有理由有其他 PK 列.
it is possible to define two foreign keys as a composite primary key of a model?
A user can only be a member of one family, a family can have many members and the family-members table need the references of the user and family
const User = sequelize.define(
'User',
{
id: { type: dataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true },
name: { type: dataTypes.STRING(30) },
email: { type: dataTypes.STRING(30) }
...
},
{
classMethods: {
associate(models) {
User.hasOne(models.FamilyMember, {
foreignKey: 'user_id'
}
}
}
}
)
const Family = sequelize.define(
'Family',
{
name: { type: dataTypes.STRING(30) }
},
{
classMethods: {
associate(models) {
Family.hasMany(models.FamilyMember, {
foreignKey: 'family_id'
}
}
}
}
)
const FamilyMember = sequelize.define(
'FamilyMember',
{
name: { type: dataTypes.STRING(30) },
/*
family_id and user_id will be here after associations but I wanted them to be a composite primaryKey
*/
}
)
In fact, almost I got the solution from documentation:
User = sequelize.define('user', {});
Project = sequelize.define('project', {});
UserProjects = sequelize.define('userProjects', {
status: DataTypes.STRING
});
User.belongsToMany(Project, { through: UserProjects });
Project.belongsToMany(User, { through: UserProjects });
By default the code above will add projectId and userId to the UserProjects table, and remove any previously defined primary key attribute - the table will be uniquely identified by the combination of the keys of the two tables, and there is no reason to have other PK columns.
这篇关于Sequelize,外键作为复合主键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!