在typeorm(typegraphql)中建立多对多关系的正确方法是什么

时间:2021-05-25 15:24:03

标签: javascript sql node.js typeorm typegraphql

我有两个实体 UserGame。 所以一个User有很多不同的games,一个Game里面有两个(或更多)users。 我决定使用这样的多对多关系:

@ObjectType()
@Entity()
export class User extends BaseEntity {
  ...

  @ManyToMany(() => Game, game => game.players, { cascade: true }) @JoinTable()
  games: Game[];
}
@ObjectType()
@Entity()
export class Game extends BaseEntity {
  
  // I want to remove this p1id and p2id fields, and do user relations instead
  @Field(() => Int, {nullable: false})
  @Column()
  p1id: number;

  @Field(() => Int, {nullable: true, defaultValue: 0})
  @Column({nullable: true, default: 0})
  p2id: number;

  ...

  @ManyToMany(() => User, user => user.games)
  players: User[]  
}

所以我在解析器中写了这个函数:

@Mutation(() => Game)
  async createGame(@Ctx() { req }: MyContext) {

    const initialWord = await generateRandomWord();
    const currUser = await User.findOne({ id: req.session.userId });

    if (currUser) {
      let userGames = [];
      if (currUser.games !== undefined) {
        // Get list of other user's games 
        currUser.games.map((i) => userGames.push(i));
      }      
      const game = await getConnection()
        .createQueryBuilder()
        .insert()
        .into(Game)
        .values({
          status: false,
          initialWord,
          p1id: req.session.userId,
        })
        .returning("*")
        .execute();
      const res = game.raw[0] as Game;
      // Add new game to list
      userGames.push(res);                
      await getConnection()
      .createQueryBuilder()
      .update(User)
      .set({games: userGames as Game[]})
      .where("id = :id", {id: req.session.userId})
      .execute();      
      return game.raw[0] as Game;
    }
    throw new UnauthorizedError();
  }

但它抛出这个错误:

query failed: UPDATE "user" SET "userId" = $1, "updatedAt" = CURRENT_TIMESTAMP WHERE "id" = $2 -- PARAMETERS: [null,1]
[0] error: error: column "userId" doesn't exist in table "user"

为什么要检查 userId 列?它从哪里来?

0 个答案:

没有答案
相关问题