27

1 回のリクエストで、ユーザーを作成し、お気に入りの映画 (映画コレクションへの参照と各映画の個人的な評価を含むオブジェクトの配列) を追加できるようにする必要があります。

このように見えるもの(疑似コード)

var exSchema = `
 type Mutation {
    addUser(
        name: String!
        favMovies: [{ movie: String! #ref to movies coll
                      personal_rating: Int! # this is different for every movie
                   }]
    ) : User
 }
...
`

単一のリクエストでこれを行うgraphqlの方法は何ですか? 複数のミューテーション/リクエストで結果を達成できることはわかっていますが、1 つのミューテーションで実行したいと考えています。

4

6 に答える 6

55

このような配列を渡すことができます

var MovieSchema = `
  type Movie {
   name: String
  }
  input MovieInput {
   name: String
  }
  mutation {
   addMovies(movies: [MovieInput]): [Movie]
  }
`

次に、突然変異で、次のような配列を渡すことができます

mutation {
  addMovies(movies: [{name: 'name1'}, {name: 'name2'}]) {
    name
  }
}

コードをテストしていませんが、アイデアはわかります

于 2017-01-05T09:15:02.850 に答える
11

私はこの単純な解決策を思いつきました.JSONは使用しません. 1 つの入力のみが使用されます。それが他の誰かを助けることを願っています。

このタイプに追加する必要がありました:

type Option {
    id: ID!
    status: String!
    products: [Product!]!
}

次のように、ミューテーション タイプに追加し、入力を追加できます。

type Mutation {
    createOption(data: [createProductInput!]!): Option!
    // other mutation definitions
}

input createProductInput {
    id: ID!
    name: String!
    price: Float!
    producer: ID!
    status: String
}

次に、次のリゾルバーを使用できます。

const resolvers = {
    Mutation: {
      createOption(parent, args, ctx, info) {

        const status = args.data[0].status;

        // Below code removes 'status' from all array items not to pollute DB.
        // if you query for 'status' after adding option 'null' will be shown. 
        // But 'status': null should not be added to DB. See result of log below.
        args.data.forEach((item) => {
            delete item.status
        });

        console.log('args.data - ', args.data);

        const option = {
            id: uuidv4(),
            status: status,  // or if using babel    status,
            products: args.data
        }

        options.push(option)

        return option
      },
    // other mutation resolvers
    }

これを使用してオプションを追加できます (STATUS は配列の最初の項目から取得されます - null 可能です)。

mutation{
  createOption(data:
    [{
            id: "prodB",
            name: "componentB",
            price: 20,
            producer: "e4",
            status: "CANCELLED"
        },
        {
            id: "prodD",
            name: "componentD",
            price: 15,
            producer: "e5"
        }
    ]
  ) {
    id
    status
    products{
      name
      price
    }
  }
}

プロデュース:

{
  "data": {
    "createOption": {
      "id": "d12ef60f-21a8-41f3-825d-5762630acdb4",
      "status": "CANCELLED",
      "products": [
        {
          "name": "componentB",
          "price": 20,
        },
        {
          "name": "componentD",
          "price": 15,
        }
      ]
    }
  }
}

上記の結果を得るには、以下を追加する必要があることは言うまでもありません。

type Query {
    products(query: String): [Product!]!
    // others
}

type Product {
    id: ID!
    name: String!
    price: Float!
    producer: Company!
    status: String
}

それが最善の方法ではないことはわかっていますが、ドキュメントでそれを行う方法が見つかりませんでした。

于 2019-01-01T09:15:32.600 に答える
0

それらを JSON 文字列として渡します。それが私がすることです。

于 2016-11-19T20:33:51.027 に答える