如何将参数传递给 GraphQL 中的子属性

Posted

技术标签:

【中文标题】如何将参数传递给 GraphQL 中的子属性【英文标题】:How to pass params to child property in GraphQL 【发布时间】:2018-11-12 11:05:38 【问题描述】:

我对 GraphQL 还很陌生,正在成为一个超级粉丝 :)

但是,我不清楚。我正在使用 Prisma 和 GraphQL-Yoga 和 Prisma 绑定。

我不知道如何将参数从我的 graphQL 服务器传递到子属性。不知道这是否清楚,但我会用代码显示它,希望更容易:)

这些是我的类型

type User 
  id: ID! @unique
  name: String!
  posts: [Post!]!


type Post 
  id: ID! @unique
  title: String!
  content: String!
  published: Boolean! @default(value: "false")
  author: User!

我的 schema.graphql

type Query 
  hello: String
  posts(searchString: String): [Post]
  users(searchString: String, searchPostsTitle: String): [User]
  me(id: ID): User

和我的用户解析器:

import  Context  from "../../utils";

export const user = 
  hello: () => "world",
  users: (parent, args, ctx: Context, info) => 
    return ctx.db.query.users(
      
        where: 
          OR: [
            
              name_contains: args.searchString
            ,
            
              posts_some:  title_contains: args.searchPostsTitle 
            
          ]
        
      ,
      info
    );
  ,
  me: (parent, args, ctx: Context, info) => 
    console.log("parent", parent);
    console.log("args", args);
    console.log("info", info);
    console.log("end_________________");
    return ctx.db.query.user( where:  id: args.id  , info);
  
;

和我的帖子解析器

import  Context  from "../../utils";

export const post = 
  posts: (parent, args, ctx: Context, info) => 
    return ctx.db.query.posts(
      
        where: 
          OR: [
            
              title_contains: args.searchString
            ,
            
              content_contains: args.searchString
            
          ]
        
      ,
      info
    );
  
;

所以,现在:)

当我在我的 prisma 服务上的 GraphQL 操场上时,我可以执行以下操作:


  user(where: id: "cjhrx5kaplbu50b751a3at99d") 
    id
    name
    posts(first: 1, after: "cjhweuosv5nsq0b75yc18wb2v") 
      id
      title
      content
    
  

但是我不能在服务器上做,如果我做这样的事情..我收到错误:

"error": "Response not successful: Received status code 400"

这就是我正在尝试的:


  me(id: "cjhrx5kaplbu50b751a3at99d") 
    id
    name
    posts(first:1) 
      id
      title
      content
    
  

有人知道我该怎么做吗?

【问题讨论】:

好的..我解决了 :) 有时它只需要在此处编写和解释时进行思考..我会将问题留给有同样问题的其他人.. 【参考方案1】:

因为我有一个自定义类型的用户,帖子没有像生成的那样的参数。要么我使用生成的,要么修改它看起来像这样:

type User 
  id: ID!
  name: String!
  posts(where: PostWhereInput, orderBy: PostOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Post!]

编辑 2018 年 6 月 4 日

# import Post from './generated/prisma.graphql'

type Query 
  hello: String
  posts(searchString: String): [Post]
  users(searchString: String, where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [User]
  me(id: ID): User


type Mutation 
  createUser(name: String!): User
  createPost(
    title: String!
    content: String!
    published: Boolean!
    userId: ID!
  ): Post

我从 prisma.graphql 手动复制了参数。

【讨论】:

可以分享一下新的schema.graphql吗?您需要从新参数中导入类型 :) 是的!请注意,UserWhereInputUserOrderByInputUser 是从第一个留置权中的 import Post 语句“传递”导入的 :)

以上是关于如何将参数传递给 GraphQL 中的子属性的主要内容,如果未能解决你的问题,请参考以下文章

将多个参数传递给 GraphQL 查询

Apollo Client Angular:如何将从查询中获得的数据作为参数传递给graphql中的另一个查询?

如何将参数传递给graphql查询?

将 unicode 参数传递给 ShellExecuteEx 中的子进程

将枚举类型作为参数传递给 GraphQL 查询 - Quarkus

GraphQL 将参数传递给子解析