Nexus-Prisma: порядок вложенных соединений - PullRequest
7 голосов
/ 27 мая 2019

Каков наилучший способ сохранить порядок вложенных объектов в схеме.

Моя схема:

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.

1 Ответ

2 голосов
/ 07 июня 2019

Для отношений 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
    }
  }
}

Обновление значения "order" должно быть простым, поэтому я опущу его здесь.

Надеюсьэто отвечает на ваш вопрос!

...