javascript - 在 Sequelize 中从关联创建复合主键

标签 javascript sql orm sequelize.js

我有两个模型:PersonTeam
假设模型很简单(假设基本的字符串/整数类型):

team:
  id
  name
  ownerId


person:
  id
  name

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

要做到这一点,在 Sequelize 中很简单:
Team.belongsToMany(Person, {through: 'TeamPerson'})
Person.belongsToMany(Team, {through: 'TeamPerson'})

这将创建一个名为 TeamPerson 的新表,其中包含 teamIdpersonId 。我假设这个表的主键是两个 ID 的组合。

我也希望每支球队都有一个队长:
Team.belongsTo(Person {as: 'captain'})

这会将 captainId 添加到 Team 模型中。

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

本质上,名称和船长 ID 应该是 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)
            }
            ...

关于javascript - 在 Sequelize 中从关联创建复合主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55011065/

相关文章:

javascript - 为什么我无法获取这个 var 的值?

sql - Microsoft 主数据服务 - 何时使用?

mysql - 应用触发器后受影响的行数

orm - Doctrine 2 中的不可变集合?

javascript - dataLayer.push() 在 anchor 上触发时肯定会向谷歌发送数据吗?

javascript - 如何在点击面板前后添加新面板

javascript - 通过切换将文本传递到面板

java - 异常 java.sql.SQLException : Parameter index out of range (1 > number of parameters, 为 0)

java - Spring Data REST - 检测到具有相同关系类型的多个关联链接

php - Doctrine 2 - 没有要由 orm :generate-repositories 处理的元数据类