首页 文章

sequelize-typescript多对多关系模型数据

提问于
浏览
1

我正在使用sequelize-typescript库的sequelize,我正在尝试实现以下关系:

Team.ts

@Scopes({
  withPlayers: {
    include: [{model: () => User}]
  }
})
@Table
export default class Team extends Model<Team> {

  @AllowNull(false)
  @Column
  name: string;

  @BelongsToMany(() => User, () => TeamPlayer)
  players: User[];
}

User.ts

@Scopes({
  withTeams: {
    include: [{model: () => Team, include: [ () => User ]}]
  }
})
@Table
export default class User extends Model<User> {

  @AllowNull(false)
  @Column
  firstName: string;

  @AllowNull(false)
  @Column
  lastName: string;

  @BelongsToMany(() => Team, () => TeamPlayer)
  teams: Team[];
}

TeamPlayer.ts

@DefaultScope({
  include: [() => Team, () => User],
  attributes: ['number']
})
@Table
export default class TeamPlayer extends Model<TeamPlayer> {

  @ForeignKey(() => User)
  @Column
  userId: number;

  @ForeignKey(() => Team)
  @Column
  teamId: number;

  @Unique
  @Column
  number: number;
}

现在,当查询播放器时,您将获得具有以下数据的对象:

{
  "id": 1,
  "name": "Doe's Team",
  "players": [
    {
      "id": 1,
      "firstName": "John",
      "lastName": "Doe",
      "TeamPlayer": {
        "userId": 1,
        "teamId": 1,
        "number": 32
    }
 }]
}

现在有几件我无法完成的事情......

1)我想将 TeamPlayer 重命名为"membership";但不是通过更改类的名称2) TeamPlayer 的内容不应该有id`s,但我希望它包含团队的数据,例如:

{
  "firstName": "John",
  "lastName": "Doe"
  "membership": {
     "number": 32
 }

在上面的类中,我尝试将范围设置为 TeamPlayer 类,仅在 TeamMember 包含内包含 number ,但没有效果 .

我曾经让 TeamPlayer 类具有 teamplayer 的直接成员资格,但该解决方案为 TeamPlayer 类添加了多余的 id ,并且也没有阻止团队中的重复成员资格 . 我确实可以在这些情况下手动(=代码中)防止重复,但这并不优雅 .

1 回答

  • 1

    我最终通过添加从 TeamPlayerUserTeam 的一对多关系来解决这个问题,并且通过添加两个 @ForeignKey 字段来找出使 teamId userId 对唯一的方法,如下所示:

    TeamPlayer.ts

    @Table
    export default class TeamPlayer extends Model<TeamPlayer> {
    
      @BelongsTo(() => Team)
      team: Team;
    
      @ForeignKey(() => Team)
      @PrimaryKey
      @Column
      teamId: number;
    
      @BelongsTo(() => User)
      user: User;
    
      @ForeignKey(() => User)
      @PrimaryKey
      @Column
      userId: number;
    
      @Column
      number: number;
    }
    

    User.ts

    @Table
    export default class User extends Model<User> {
    
      @AllowNull(false)
      @Column
      firstName: string;
    
      @AllowNull(false)
      @Column
      lastName: string;
    
      @HasMany(() => TeamPlayer)
      teams: TeamPlayer[];
    }
    

    Team.ts

    export default class Team extends Model<Team> {
      @AllowNull(false)
      @Column
      name: string;
    
      @HasMany(() => TeamPlayer)
      players: TeamPlayer[];
    }
    

    此解决方案允许我通过范围控制包含的查询属性,并为我提供适当的对象输出 .

相关问题