Нужно ли мне создавать новый тип для определения массива объектов в схемах GraphQL?

Я пытаюсь воспроизвести REST API, который я создал в прошлом, и одна часть, которая заставила меня задуматься, заключалась в том, что одна из моих таблиц имеет массив объектов. Так, например, у меня есть таблица под названием Профиль, и она содержит массивы Опыт и Образование, которые строго находятся в Профиле, но также имеют свои собственные поля, но не свою собственную таблицу.

Пока я добавлял поля в GraphQL, я наткнулся на это, на самом деле не имея твердого решения, кроме как создавать новые типы, а затем связывать их с отношениями, а затем иметь резолвер или интерфейс, чтобы убедиться, что профиль создается сначала до опыта. / Образовательная часть есть. Я не уверен, правильный ли это способ сделать это или есть лучший способ сделать это. Ниже приведен фрагмент того, что я в конечном итоге использовал ... глядя на страницу администратора, там созданы таблицы для профиля, опыта и образования, которые ожидаются. Но есть ли способ иметь только Профиль и выполнять что-то подобное? Или это скорее образ жизни с GraphQL?

type Profile {
    id: ID! @id
    handle: String!
    company: String
    website: String
    location: String
    status: String!
    githubUsername: String
    experience: [Experience!] @relation(link: INLINE)
    education: [Education!] @relation(link: INLINE)
}

type Experience {
  id: ID! @id
  title: String!
  company: String!
}

type Education {
  id: ID! @id
  title: String!
  company: String!
}


person user3026715    schedule 29.08.2019    source источник
comment
Этот вопрос действительно специфичен для Prisma. Сам GraphQL не заботится об уровне хранения.   -  person Daniel Rearden    schedule 29.08.2019


Ответы (1)


В Prisma вы можете использовать встроенный типы. Вы бы удалили директиву @relation и добавили директивы @embedded к встраиваемым типам:

type Profile {
    id: ID! @id
    handle: String!
    company: String
    website: String
    location: String
    status: String!
    githubUsername: String
    experience: [Experience!]
    education: [Education!]
}

type Experience @embedded {
  title: String!
  company: String!
}

type Education @embedded {
  title: String!
  company: String!
}

Однако это возможно только в том случае, если вы используете MongoDB для своей базы данных и есть некоторые конкретные ограничения, перечисленные в документации при использовании встроенных типов.

person Daniel Rearden    schedule 29.08.2019
comment
О, это именно то, что я искал! Спасибо! - person user3026715; 29.08.2019