Объединение Sequlize имеет много ассоциаций в одной области - PullRequest
0 голосов
/ 11 апреля 2020

Для проекта, над которым я работаю, игрок имеет несколько игр. Но они всегда нужны комбинированным образом.

Так что мне было интересно, как я могу это сделать, чтобы я мог поместить его в мою схему graphql как элемент-подпись под названием games.

Я сделал нечто подобное для fullName, но не смог найти способ сделать объединенную ассоциацию

@Table({
  timestamps: true
})
export class Player extends Model<Player> {

  @Column({ unique: 'compositeIndex' })
  firstName: string;

  @Column({ unique: 'compositeIndex' })
  lastName: string;

  @Column({ unique: 'compositeIndex' })
  memberId: string;

  // Assicioations
  @HasMany(() => Game, { as: 'player1-team1', foreignKey: 'player1Team1Id' })
  games1?: Game[];
  @HasMany(() => Game, { as: 'player1-team2', foreignKey: 'player1Team2Id' })
  games2?: Game[];
  @HasMany(() => Game, { as: 'player2-team1', foreignKey: 'player2Team1Id' })
  games3?: Game[];
  @HasMany(() => Game, { as: 'player2-team2', foreignKey: 'player2Team2Id' })
  games4?: Game[];

  @Column(DataType.VIRTUAL(DataType.STRING, ['firstName', 'lastName']))
  get fullName(this: Player): string {
    return `${this.firstName || ''} ${this.lastName || ''}`.trim();
  }

  get games() {
    return [...this.games1, ...this.games2, ...this.games3, ...this.games4];
  }
}

Текущий объект схемы

  const playerType = new GraphQLObjectType({
    name: 'Player',
    description: 'A Player',
    fields: Object.assign(attributeFields(sequelizeInstance.models.Player), {
      games: {
        type: new GraphQLList(gameType),
        resolve: resolver(/* Some magic here? */),
      }
    })
  });

  return new GraphQLSchema({
    query: new GraphQLObjectType({
      name: 'RootQueryType',
      fields: {
        player: {
          type: playerType,
          args: {
            id: {
              description: 'id of the user',
              type: new GraphQLNonNull(GraphQLID)
            }
          },
          resolve: resolver(Player)
        }
      }
    })
  });
};

1 Ответ

0 голосов
/ 11 апреля 2020

Нашел «решение» моей проблемы. Я сделал «ошибку», что сделал 4 внешних ключа. создав выпуски «многие ко многим», я смог заставить все работать так, как я хотел.

Но мне все еще интересно, как можно это сделать ...

...