Итак, в моей модели данных 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]
}
Затем у меня есть это как мутация для обновления символов в моей схеме. Я передаю массив идентификаторов игр, потому что существует возможность добавления нескольких игр в одну и ту же мутацию:
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.info(args.games);
const res = await ctx.db.mutation.updateCharacter({
data: updates,
games: {
connect: {
id: args.games
}
},
where: {
id: args.id
}
}, info);
return res;
}
И следующая мутация написана React-стороной. Он предназначен для передачи массива идентификаторов в мутацию (что ожидается, поскольку схема предполагает, что будет передан массив идентификаторов:
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 в форме для мутации.
В результате мутация проходит, но обновит только поля имени, а связь с Играми останется неизменной.
Не уверен, что я могу сделать, чтобы это мутировало должным образом. Я не уверен, является ли передача массива непосредственно в мутацию в соединении причиной проблемы, но я попытался сопоставить и передать каждый идентификатор игры по отдельности, но получил тот же результат: соединение не обновлялось.
Проблема кажется двоякой.
По поводу отсутствия каких-либо изменений:
В написанной мутации games
добавляется к асинхронному запросу json вне data
, что означает, что данные никогда не будут найдены запросом.
Скорее, чем:
data: ...,
games: ...
games
должен быть частью таких данных:
data: {
games: ...
}
Что касается желания сделать несколько подключений:
GraphQL поддерживает этот стиль вложенных обновлений, используя следующий синтаксис соединения:
connect: [
{ id : /* id from args */ },
{ id : /* another id from args */ },
...
]