我想实现多对多连接(我使用 type-graphql、graphql、typeorm),我需要创建一个游戏,同时将它放在玩家的游戏数组中:
@ObjectType()
@Entity()
export class User extends BaseEntity {
...
@ManyToMany(() => Game, game => game.players, { cascade: true }) @JoinTable()
games: Game[];
}
@ObjectType()
@Entity()
export class Game extends BaseEntity {
// От этих p1id и p2id хочу отказаться, чтобы можно было ссылаться на связь с User
@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) {
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;
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: столбец "userId" в таблице "user" не существует
这个 userId 在请求中来自哪里?为什么它没有更新您需要的内容?
此处未更新,很可能是由于使用
.set. 应该用过.add。.d.ts 说:
这是工作代码:
顺便说一句,您不需要在代码中使用 QueryBuilder,
.find-ov 和.save. 我在一个例子中展示了它们的用法。node.js v16.2.0,typescript v4.2.3,typeorm v0.2.32