GRAPHQL найти элементы на основе Enum - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь найти результаты, которые соответствуют определенному перечислению, это мой type:

type User {
  id: ID! @id
  fname:String!
  lname:String!
  email:String! @unique
  password: String
  school_ID: String #@relation(Link: INLINE)
  role: [Role] @scalarList(strategy: RELATION)
  resetToken: String
  resetTokenExpiry: String
}

Я могу искать электронную почту, потому что она имеет ключ @unique, но Role - это перечисление, и я не могу добавить к нему ключ @unique, и это имеет смысл, поскольку результаты не будут уникальными.

Однако я продолжаю получать это сообщение:

"Переменная \" $ _ v0_where \ "получила недопустимое значение {\" role \ ": \" TEACHER \ "}; Поле \" role \ "не определено типом UserWhereUniqueInput."

Использование электронной почты дает мне желаемый результат, если я хочу использовать электронную почту для поиска элементов.

Я хочу получить массив, возвращающий все объекты, соответствующие выбранному результату перечисления.

В моей схеме у меня есть это:

users: [User]!
user(where: UserWhereInput!): User
findUser(role: Role, id: ID, email: String): User

В моих средствах разрешения запросов у меня есть следующее, с которым я играю:

  users: forwardTo('db'),
  user: forwardTo('db'),

  async findUser(parent, args, ctx, info) {
    return ctx.db.query.user({
      where: {email: args.email, id: args.id, role: args.role}
    }, info)
  },

Я использую призму (1.17. 1) для генерации моих схем

Как мне изменить мой код или функцию findUser, чтобы получить желаемый результат?

1 Ответ

0 голосов
/ 10 февраля 2020

Вы используете функцию ctx.db.query.user со следующей подписью:

user: (where: UserWhereUniqueInput) => UserNullablePromise;

Как видите, для нее требуется тип UserWhereUniqueInput, где условие. Почему? Потому что пользовательская функция всегда должна возвращать только один уникальный объект. С другой стороны, есть также функция ctx.db.query.users:

  users: (args?: {
    where?: UserWhereInput;
    orderBy?: UserOrderByInput;
    skip?: Int;
    after?: String;
    before?: String;
    first?: Int;
    last?: Int;
  }) => FragmentableArray<User>;

. Как видите, эта функция имеет больше опций и использует UserWhereInput для определения условия где. Это также будет включать в себя роль пользователя в вашем случае. Эта функция может возвращать несколько объектов, и вы можете фильтровать / обрабатывать соответственно.

Подсказка: вы также можете проверить созданный клиент Prisma самостоятельно. Путь обычно будет что-то вроде src\generated\prisma-client\index.ts. Там вы можете увидеть определения интерфейса всех функций, например UserWhereUniqueInput, а также UserWhereInput. Таким образом, вы можете проверить, что возможно, а что нет.

...