Prisma,GraphQL和Apollo中具有突变的数据关系和连接类型

问题描述 投票:0回答:1

很长的帖子,很抱歉,但是我尝试了尽可能详细。

我如何编辑当前模型,架构和解析器,以便能够通过Web表单将相关类型(供应商)保存/连接到我创建的类型(项目)?

我想创建一个库存项目并选择要与该项目相关联的供应商。

我有一个像这样的Prisma数据模型(为简单起见,我有其他字段,因为我可以很容易地保存其他字段;这只是与其他类型之间存在关系的原因...

物品可能有也可能没有与之关联的供应商。供应商可能有也可能没有当前与之关联的项目列表。

type Item {
  id: ID! @id
  name: String!
  description: String!
  vendor: Vendor
}

type Vendor {
  id: ID! @id
  items: [Item!]
}

我有一个像这样的graphql模式(与问题末尾的修改后的模式比较)...

type Mutation {
  createItem(
    name: String! 
    description: String! 
  ): Item!
}

我的解析器:

async createItem(parent, args, ctx, info) {
  const item = await ctx.db.mutation.createItem(
    {
        data: {
            ...args,
        },
    }, info);

    return item;
}

我的React组件包含以下内容:

const CREATE_ITEM_MUTATION = gql`
  mutation CREATE_ITEM_MUTATION(
    $name: String!
    $description: String!
  ) {
    createItem(
      name: $name
      description: $description
    ) {
      id
      name
      description
      vendor {
        id
      }
    }
  }
`;
const ALL_VENDORS_QUERY = gql`
  query ALL_VENDORS_QUERY {
    vendors {
      id
    }
  }
`;

稍后以HTML格式出现在网页上,我有:

<Query query={ALL_VENDORS_QUERY}>
  {({ data, loading }) => (
    <select
      id="vendor"
      name="vendor"
      onChange={this.handleChange}
      value={this.state.vendor}
    >
      <option>Vendor</option>
        {data.vendors.map(vendor => (
          <option key={vendor.id} value={vendor.id}>{vendor.name}</option>
        ))}
    </select>
  )}
</Query>

我只是不知道如何通过表单提交将供应商连接到该项目。如果我像这样在解析器中对供应商ID进行硬编码,就可以使它工作:

async createItem(parent, args, ctx, info) {
  const item = await ctx.db.mutation.createItem(
    {
        data: {
            vendor: {
              connect: { id: "ck7zmwfoxg4b70934wx8kgwkx" } // <-- need to dynamically populate this based on user input from the form
            },
            ...args,
        },
    }, info);

    return item;
}

...但是那显然不是我想要的。

对我来说,像这样修改我的架构最有意义:

createItem(
  name: String!
  description: String!
  vendor: Vendor <--- added
): Item!

但是当我这样做时,我得到了:

Error: The type of Mutation.createItem(vendor:) must be Input Type but got: Vendor.

我如何编辑当前模型,架构和解析器,以能够保存/连接在表单上选择的供应商ID?

reactjs react-apollo apollo-client prisma-graphql graphql-mutation
1个回答
1
投票

在这里找到我的问题的答案:How to fix 'Variable "$_v0_data" got invalid value' caused from data types relation - Mutation Resolver

[我在传播args(... args)的同时还传递了vendor参数。

这是我更新的突变:

createItem(
    name: String!
    description: String!
    vendorId: ID
    ): Item!

及其解析器:

async createItem(parent, {name, description, vendorId}, ctx, info) {
  const item = await ctx.db.mutation.createItem(
    {
        data: {
            vendor: {
              connect: { id: vendorId }
            },
            name,
            description,
        },
    }, info);

    return item;
}

轰! 💥

© www.soinside.com 2019 - 2024. All rights reserved.