我有两个实体 User
,Game
。
所以一个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
列?它从哪里来?