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

Posted

技术标签:

【中文标题】Prisma、GraphQL 和 Apollo 中具有突变的数据关系和连接类型【英文标题】:Data Relationships and Connection Types with Mutations in Prisma, GraphQL, and Apollo 【发布时间】:2020-07-02 02:56:35 【问题描述】:

抱歉,帖子太长了,但我尽量写得详细些。

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

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

我有一个这样的 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?

【问题讨论】:

【参考方案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;

轰隆隆! ?

【讨论】:

以上是关于Prisma、GraphQL 和 Apollo 中具有突变的数据关系和连接类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 Prisma 和 Apollo 调用多个 GraphQL 突变的正确方法是啥

使用 Apollo + GraphQL 将 Prisma 1 升级到 Prisma 2

Apollo 和 Prisma Graphql 显式模型关系不可查询

React-Apollo-Prisma-Graphql

Prisma v2:生成一个 .graphql 文件来编辑?

如何在 Dockerized GraphQL + Postgres 设置中运行 Prisma 迁移?