Prisma js возвращает поля соединения

Я пытаюсь реализовать пакетирование и кеширование с помощью Facebook DataLoader. Допустим, у меня есть следующая схема (взята из здесь):

type Post {
  id: ID! @id
  title: String!
  published: Boolean! @default(value: false)
  author: User
  comments: [Comment!]!
}

type User {
  id: ID! @id
  name: String
  posts: [Post!]!
  comments: [Comment!]!
}

type Comment {
  id: ID! @id
  text: String!
  post: Post!
  writtenBy: User!
}

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

const fetchCommentsByUserForSamePost = async (commentId: string, userId: string): Promise<Comment[]> => {
  const comments = await this.prisma.comment.findOne({ where: { id: commentId } })
    .post()
    .comments({
      where: {
        writtenBy: { id: userId }
      }
    })
  return comments;
}

Это хорошо работает для одного запроса, но я хотел бы выполнять запросы в пакетном режиме. В необработанном SQL я бы возвращал commentId и userId в каждой строке, так что я могу сгруппировать результаты по этим полям. Но я не могу найти способ вернуть исходный commentId с помощью Prisma, чтобы обобщить запрос для работы со списком пар commentId - userId.

Есть ли способ сделать это с помощью Prisma, или я что-то упускаю? Я знаю, что два запроса могут решить эту проблему, но это приведет к сложной логике, к тому же я бы предпочел избегать двух обращений к БД.


person fodma1    schedule 19.08.2020    source источник


Ответы (1)


Prisma 2.0 уже имеет встроенный Dataloader именно для этой цели. Это означает, что ваши преобразователи могут выполнять несколько вызовов findOne, но они будут объединены в один большой запрос SQL под капотом. Таким образом, вам не нужно реализовывать эту оптимизацию самостоятельно.

person mavilein    schedule 19.08.2020