Sequelize,外键作为复合主键 [英] Sequelize, foreign keys as composite primary key

查看:206
本文介绍了Sequelize,外键作为复合主键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以定义两个外键作为模型的复合主键?

一个用户只能是一个家庭的成员,一个家庭可以有多个成员,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.

Source

这篇关于Sequelize,外键作为复合主键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆