2
votes

Let's take an example from the github repo of prisma:

We have a user, the user could have multiple posts, and one post could have multiple links.

My goal is, to retrieve all posts and all links. This means, my response is a list (links) in a list (posts).

I want to map the values I get back as two nested lists.

datamodel.prisma

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

type Post {
  id: ID! @id
  createdAt: DateTime! @createdAt
  updatedAt: DateTime! @updatedAt
  published: Boolean! @default(value: false)
  title: String!
  content: String
  author: User!
  links: [Link]!
}

type Link {
  id: ID! @id
  url: String
  title: String
  post: Post!
}

schema.graphql

type Query {
  ...
}

type Mutation {
  ...
}

type Link {
  id: ID!
  url: String
  title: String
  post: Post!
}

type Post {
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime!
  published: Boolean!
  title: String!
  content: String
  author: User!
}

type User {
  id: ID!
  email: String!
  name: String
  posts: [Post]!
}

I want to query all posts of a user, and all of the links for every post in the response.

How would I query this request?

user {
  id
  posts {
    id
    links {
      id
    }
  }
}

The above code snipper would not work.

EDIT I want to use the following:

User: {
  listPosts: (parent, args, context, info) {
    return context.prisma.posts().links()
  }
}

So in my response (data in front-end via react-apollo Query Component), I want to map over posts AND the links in each post.

BUT the links attribute in posts is null.

Is there another way to achieve this?!

1
@DanielRearden Prisma defaults to an inline relation, so in this case, this is not necessary. - AO19
Can you clarify what's not working? What errors are you seeing? How are you actually using the above query inside your resolver? - Daniel Rearden
@DanielRearden updated my question. Thx. - AO19

1 Answers

3
votes

According to the docs:

Prisma client has a fluent API to query relations in your database. Meaning you can simply chain your method calls to navigate the relation properties of the returned records. This is only possible when retrieving single records, not for lists. Meaning you can not query relation fields of records that are returned in a list.

In order to get around that limitation, you can use the $fragment method:

const fragment = `
fragment UserWithPostsAndLinks on User {
  id
  email
  name
  posts {
    id
    title
    content
    links {
      id
      url
      title
    }
  }
}
`

const userWithPostsAndLinks = await prisma.user({ id: args.id }).$fragment(fragment)