Javascript 从Sequelize中的关联创建复合主键

Javascript 从Sequelize中的关联创建复合主键,javascript,sql,orm,sequelize.js,Javascript,Sql,Orm,Sequelize.js,我有两个模型:个人模型和团队模型 假设模型很简单,假设基本的字符串/整数类型: team: id name ownerId 及 我想表示这两个模型之间的关联,这样一个人可以属于多个团队,一个团队可以属于多个人,即多对多关系 要做到这一点,请在Sequelize中直接执行: Team.belongsToMany(Person, {through: 'TeamPerson'}) Person.belongsToMany(Team, {through: 'TeamPerson'}) 这

我有两个模型:个人模型和团队模型

假设模型很简单,假设基本的字符串/整数类型:

team:
  id
  name
  ownerId

我想表示这两个模型之间的关联,这样一个人可以属于多个团队,一个团队可以属于多个人,即多对多关系

要做到这一点,请在Sequelize中直接执行:

Team.belongsToMany(Person, {through: 'TeamPerson'})
Person.belongsToMany(Team, {through: 'TeamPerson'})
这将创建一个名为TeamPerson的新表,其中包含teamId和personId。我假设这个表的主键是两个ID的组合

我还希望每个队都有一名队长:

Team.belongsTo(Person {as: 'captain'})
这将把captainId添加到团队模型中

这是我的问题,我希望一个人能够创建一个团队,但我不希望他们能够创建两个同名团队。但是,我确实希望允许其他人创建与其他人同名的团队。因此,用户ID 1不能有两个名为Falcons的团队,但用户ID 1可以有一个名为Falcons的团队,用户ID 2可以有一个名为Falcons的团队


实际上,name和captainId应该是Team表上的复合主键。有人能告诉我如何实现这一点吗?

在允许创建新项目之前,您可以查询以前存在的人员/项目。。。大致:

    Person.findAll({
        attributes: ['id'],
        include: [{
            model: Team,
            where : { name : ***TEAM_NAME_PARAM*** }
            attributes: [
                [Sequelize.fn('count', 'id'), 'number_of_teams']
           ]
        }],
        where: { id : ***USER_ID_PARAM***},
        group: ['id']
        })        
        .then(myTeams => {
            if (myTeams.length == 0 || myTeams.Team.number_of_teams == 0) {
               // proceed with creating new team
            } else {
               // give some error message (you already have a team with that name)
            }
            ...

感谢您的回复,但是对于任何涉及创建/更新的查询,我都必须记住这一点。另外,这不是更高的开销吗?一定有办法在模型定义中定义它我想说那是不可能的。。。但医生却不这么说。签出QueryInterface对象。我没有这方面的经验,因为我更喜欢在原始SQL中创建DB对象。在team_表team_name、team_captain_id上创建唯一索引my_new_index在这两种情况下,您都需要一些代码来通知用户他们的新团队被拒绝的原因。
    Person.findAll({
        attributes: ['id'],
        include: [{
            model: Team,
            where : { name : ***TEAM_NAME_PARAM*** }
            attributes: [
                [Sequelize.fn('count', 'id'), 'number_of_teams']
           ]
        }],
        where: { id : ***USER_ID_PARAM***},
        group: ['id']
        })        
        .then(myTeams => {
            if (myTeams.length == 0 || myTeams.Team.number_of_teams == 0) {
               // proceed with creating new team
            } else {
               // give some error message (you already have a team with that name)
            }
            ...