如何在一个 GQL 突变中建立多个连接?
How to make multiple connects in one GQL mutation?
所以我的 Prisma 数据模型中有以下内容。游戏和角色之间存在关系,角色可以出现在多个游戏中。此外,当仅查询游戏时,角色应该能够在游戏中列出:
type Game {
id: ID! @unique
name: String! @unique
name_ja: String @unique
name_ko: String @unique
name_zh_CN: String @unique
name_zh_TW: String @unique
name_zh_HK: String @unique
characters: [Character]
filters: [GameFilter]
}
type Character {
id: ID! @unique
name: String! @unique
name_ja: String @unique
name_ko: String @unique
name_zh_CN: String @unique
name_zh_TW: String @unique
name_zh_HK: String @unique
games: [Game]
}
然后我将其作为更新模式中字符的突变。我传递了一系列游戏 ID,因为有可能在同一个突变中添加多个游戏:
updateCharacter(
name: String
name_ja: String
name_ko: String
name_zh_CN: String
name_zh_HK: String
name_zh_TW: String
id: ID!
games: [ID]
): Character!
并写入以下突变:
async updateCharacter(parent, args, ctx, info) {
if (!ctx.request.userId) {
throw new Error('You must be logged in');
}
const updates = {...args};
delete updates.id;
delete updates.games;
console.log(args.games);
const res = await ctx.db.mutation.updateCharacter({
data: updates,
games: {
connect: {
id: args.games
}
},
where: {
id: args.id
}
}, info);
return res;
}
并且下面的mutation写在了React端。它意味着将一组 ID 传递给突变(这是预期的,因为模式假定将传递一组 ID:
const UPDATE_CHARACTER_MUTATION = gql`
mutation UPDATE_CHARACTER_MUTATION(
$name: String!
$name_ja: String!
$name_ko: String!
$name_zh_CN: String!
$name_zh_TW: String!
$name_zh_HK: String!
$id: ID!
$games: [ID]!
) {
updateCharacter(
name: $name
name_ja: $name_ja
name_ko: $name_ko
name_zh_CN: $name_zh_CN
name_zh_TW: $name_zh_TW
name_zh_HK: $name_zh_HK
games: $games
id: $id
) {
id
name
name_ja
name_ko
name_zh_CN
name_zh_TW
name_zh_HK
games {
id
name
}
}
}
`;
我还将表单内的 onSubmit 数组中的游戏 ID 传递给突变。
结果是突变通过,但只会更新name字段,与Games的连接保持不变
不确定我能做些什么来正确地改变它。我不确定是否将数组直接传递到连接中的突变是导致问题的原因,但我尝试通过映射并单独传递每个游戏 ID,但连接未更新的结果相同。
问题似乎有两个方面。
关于完全看不到任何变化:
在写入的突变中,games
被添加到data
之外的异步请求json,这意味着请求永远不会找到数据。
而不是:
data: ...,
games: ...
games
必须是这样的数据的一部分:
data: {
games: ...
}
关于想要进行多重连接:
GraphQL 使用以下连接语法支持这种嵌套更新样式:
connect: [
{ id : /* id from args */ },
{ id : /* another id from args */ },
...
]
所以我的 Prisma 数据模型中有以下内容。游戏和角色之间存在关系,角色可以出现在多个游戏中。此外,当仅查询游戏时,角色应该能够在游戏中列出:
type Game {
id: ID! @unique
name: String! @unique
name_ja: String @unique
name_ko: String @unique
name_zh_CN: String @unique
name_zh_TW: String @unique
name_zh_HK: String @unique
characters: [Character]
filters: [GameFilter]
}
type Character {
id: ID! @unique
name: String! @unique
name_ja: String @unique
name_ko: String @unique
name_zh_CN: String @unique
name_zh_TW: String @unique
name_zh_HK: String @unique
games: [Game]
}
然后我将其作为更新模式中字符的突变。我传递了一系列游戏 ID,因为有可能在同一个突变中添加多个游戏:
updateCharacter(
name: String
name_ja: String
name_ko: String
name_zh_CN: String
name_zh_HK: String
name_zh_TW: String
id: ID!
games: [ID]
): Character!
并写入以下突变:
async updateCharacter(parent, args, ctx, info) {
if (!ctx.request.userId) {
throw new Error('You must be logged in');
}
const updates = {...args};
delete updates.id;
delete updates.games;
console.log(args.games);
const res = await ctx.db.mutation.updateCharacter({
data: updates,
games: {
connect: {
id: args.games
}
},
where: {
id: args.id
}
}, info);
return res;
}
并且下面的mutation写在了React端。它意味着将一组 ID 传递给突变(这是预期的,因为模式假定将传递一组 ID:
const UPDATE_CHARACTER_MUTATION = gql`
mutation UPDATE_CHARACTER_MUTATION(
$name: String!
$name_ja: String!
$name_ko: String!
$name_zh_CN: String!
$name_zh_TW: String!
$name_zh_HK: String!
$id: ID!
$games: [ID]!
) {
updateCharacter(
name: $name
name_ja: $name_ja
name_ko: $name_ko
name_zh_CN: $name_zh_CN
name_zh_TW: $name_zh_TW
name_zh_HK: $name_zh_HK
games: $games
id: $id
) {
id
name
name_ja
name_ko
name_zh_CN
name_zh_TW
name_zh_HK
games {
id
name
}
}
}
`;
我还将表单内的 onSubmit 数组中的游戏 ID 传递给突变。
结果是突变通过,但只会更新name字段,与Games的连接保持不变
不确定我能做些什么来正确地改变它。我不确定是否将数组直接传递到连接中的突变是导致问题的原因,但我尝试通过映射并单独传递每个游戏 ID,但连接未更新的结果相同。
问题似乎有两个方面。
关于完全看不到任何变化:
在写入的突变中,games
被添加到data
之外的异步请求json,这意味着请求永远不会找到数据。
而不是:
data: ...,
games: ...
games
必须是这样的数据的一部分:
data: {
games: ...
}
关于想要进行多重连接:
GraphQL 使用以下连接语法支持这种嵌套更新样式:
connect: [
{ id : /* id from args */ },
{ id : /* another id from args */ },
...
]