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