Как разрешить подвыборки/отношения в prisma (вложенные списки)

Возьмем пример из репозитория prisma на github:

У нас есть пользователь, у пользователя может быть несколько сообщений, и у одного сообщения может быть несколько ссылок.

Моя цель - получить все сообщения и все ссылки. Это означает, что мой ответ представляет собой список (ссылки) в списке (посты).

Я хочу сопоставить значения, которые я получаю, как два вложенных списка.

модель данных.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!
}

схема.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]!
}

Я хочу запросить все сообщения пользователя и все ссылки для каждого сообщения в ответе.

Как мне запросить этот запрос?

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

Приведенный выше фрагмент кода не сработает.

РЕДАКТИРОВАТЬ Я хочу использовать следующее:

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

Итак, в моем ответе (данные во внешнем интерфейсе через компонент запроса response-apollo) я хочу сопоставить сообщения и ссылки в каждом сообщении.

НО атрибут ссылок в сообщениях равен нулю.

Есть ли другой способ добиться этого?!

@DanielRearden Prisma по умолчанию использует встроенное отношение, поэтому в данном случае в этом нет необходимости.

AO19 05.06.2019 19:13

Можете пояснить, что не работает? Какие ошибки вы видите? Как вы на самом деле используете приведенный выше запрос внутри своего распознавателя?

Daniel Rearden 05.06.2019 19:19

@DanielRearden обновил мой вопрос. Спасибо.

AO19 05.06.2019 19:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
2
3
1 672
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документам:

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.

Чтобы обойти это ограничение, вы можете использовать метод $fragment:

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)

Другие вопросы по теме