Отношения одного типа в GraphQL / Prisma

Я пытаюсь создать отношение «один ко многим» одного типа. В этом случае пользователь может отчитываться перед одним пользователем, а ему, в свою очередь, отчитываются многие пользователи.

Моя модель данных в настоящее время выглядит так:

type User {
  id: ID! @id
  name: String!
  email: String! @unique
  reportsTo: User @relation(name: "UserReports")
  reports: [User] @relation(name: "UserReports")
}

Я ожидаю, что добавление userId в отчеты должно добавить соответствующий идентификатор пользователя в отчеты.

Однако добавление userId в reportsTo означает добавление userId в отчеты того же пользователя, а не в отчеты других пользователей.


person Jonny    schedule 12.08.2019    source источник


Ответы (1)


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

Я создал два разных типа: один - это «супервизор», который представляет собой пользователя, который контролирует других пользователей, но у нас будут эти пользователи как второй тип, «супервизируемые». Каждый пользователь может быть как супервизором, так и супервизируемым. Существует связь между пользователем и каждым из этих двух типов, а также связь между этими двумя типами.

Это модель данных:

type User {
  id: ID! @id
  name: String!
  email: String! @unique
  supervisor: Supervisor @relation(name: "UserToSupervisor")
  supervisee: Supervisee @relation(name: "UserToSupervisee")
}

type Supervisor {
  id: ID! @id
  user: User! @relation(name: "UserToSupervisor")
  supervisees: [Supervisee!]! @relation(name: "SupervisorToSupervisee")
}

type Supervisee {
  id: ID! @id
  user: User! @relation(name: "UserToSupervisee")
  supervisor: Supervisor! @relation(name: "SupervisorToSupervisee")
}

Вы должны рассматривать поле «супервизор» не как супервизор этого пользователя, а как то, что пользователь сам может быть супервизором. То же самое и с супервизируемым. В основном супервизор и супервизируемый являются расширениями пользователя, и рабочие отношения между ними определяются между этими двумя типами.

person Andrew1325    schedule 12.08.2019