Как лучше всего поддерживать порядок вложенных объектов в схеме.
Моя схема:
type Article {
id: ID! @id
pages: [Page!]!
}
type Page {
id: ID! @id
}
Вот как я пытаюсь отсортировать страницы (безуспешно):
updateArticle({
variables: {
aricle.id,
data: {
pages: {
connect: reorderPages(aricle.pages)
}
}
}
Резолвер:
t.field("updateArticle", {
type: "Article",
args: {
id: idArg(),
data: t.prismaType.updateArticle.args.data
},
resolve: (_, { id, data }) => {
return ctx.prisma.updateArticle({
where: { id },
data
});
}
});
Я понимаю, почему этот подход неверен. Я предполагаю, что заказ должен быть записан в базу данных по индексу заказа в таблице соединений. Я не знаю, как это обработать с помощью GraphQL/Nexus/Prisma/MySQL.
Итак, вы хотите обновить все вложенные объекты с помощью индекса порядка, а затем отсортировать их по порядку?
Для отношений N:M схема будет выглядеть так:
type Article {
id: ID! @id
title: String!
items: [ArticleItemEdge!]!
}
type ArticleItemEdge {
id: ID! @id
article: Article! @relation(link: INLINE)
item: Item! @relation(link: INLINE)
order: Int!
}
type Item {
id: ID! @id
title: String!
articles: [ArticleItemEdge!]!
}
А затем запрашивайте статьи в более «ретрансляционном» режиме, таком как мода, с ребрами и узлами.
query {
articles {
items(orderBy: order_ASC) {
item {
title
}
}
}
}
А если N:M не нужен, вы можете обновить определение схемы следующим образом:
type Article {
id: ID! @id
items: [Item!]!
}
type Item {
id: ID! @id
article: Article! @relation(link: INLINE)
order: Int!
}
^ это превратит таблицы БД в отношение 1:N, а не n:m
Затем вы можете выполнить запрос следующим образом:
query {
articles {
id
items(orderBy: order_ASC) {
id
}
}
}
Обновление значения «заказа» должно быть простым, поэтому я его здесь не привожу.
Надеюсь, это ответит на ваш вопрос!
Почему вы не используете аргумент orderBy?