【问题标题】:How to make multiple connects in one GQL mutation?如何在一个 GQL 突变中建立多个连接?
【发布时间】:2019-09-01 10:56:49
【问题描述】:

所以我的 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;
    }

下面的变异写在 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 传递给突变。

结果是mutation通过了,但只会更新name字段,与Games的连接保持不变。

不知道我能做些什么来使它正确地变异。我不确定是否将数组直接传递到连接中的突变是导致问题的原因,但我尝试映射并单独传递每个游戏 ID,但连接未更新的结果相同。

【问题讨论】:

    标签: javascript node.js reactjs apollo-server prisma-graphql


    【解决方案1】:

    问题似乎有两个方面。

    关于根本看不到任何变化:

    在编写的突变中,games 被添加到 data 之外的异步请求 json 中,这意味着请求永远不会找到数据。 而不是:

    data: ...,
    games: ...
    

    games 必须是这样的数据的一部分:

    data: {
      games: ...
    }
    

    关于想要做多个连接:

    GraphQL 使用以下连接语法支持这种嵌套更新样式:

    connect: [
      { id : /* id from args */ },
      { id : /* another id from args */ },
      ...
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 2018-03-02
      • 1970-01-01
      • 2020-04-25
      • 2017-08-10
      相关资源
      最近更新 更多